Методы XmlElement.Attributes.Remove * отлично работают для произвольных атрибутов, в результате чего удаленные атрибуты удаляются из свойства XmlDocument.OuterXml. Однако атрибут Xmlns отличается. Вот пример:
XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1 = ""value1"" xmlns = ""http://mynamespace.com/"" attr2 = ""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal = {0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal = {0}", doc.DocumentElement.Attributes["xmlns"]);
В результате получается
xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1 = "value1" xmlns = "http://mynamespace.com/" />
Атрибут кажется удаленным из коллекции Attributes, но не удален из XmlDocument.OuterXml. Думаю, это из-за особого значения этого атрибута.
Вопрос в том, как удалить атрибут xmlns с помощью .NET XML API. Очевидно, я могу просто удалить атрибут из строкового представления этого, но мне интересно, можно ли сделать то же самое с помощью API.
@Edit: я говорю о .NET 2.0.





Да, поскольку это имя ELEMENT, вы не можете удалить его явно. Использование WriteStartElement и WirteStartAttribute XmlTextWriter и замена атрибута пустыми пробелами, скорее всего, приведет к выполнению работы.
Сейчас проверяю. буду обновлять.
Может быть, через XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx, но это всего лишь предположение.
Я пробовал это, но не смог понять, как удалить пространство имен с помощью этого класса.
.NET DOM API не поддерживает изменение пространства имен элемента, что вы, по сути, пытаетесь сделать. Итак, чтобы решить вашу проблему, вам нужно так или иначе создать новый документ. Вы можете использовать тот же API .NET DOM и создать новый элемент, не указывая его пространство имен. В качестве альтернативы вы можете создать таблицу стилей XSLT, которая преобразует исходный документ с «пространством имен» в новый, в котором элементы не будут уточнены пространством имен.
Я не уверен, но пока нет положительного ответа, я считаю, что это правда.
Разве это не должно было удалить пространства имен?
XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");
Но в любом случае классы XElement, XDocument и XNameSpace из пространства имен System.Xml.Linq (.Net 3.0) намного лучше, чем старая модель XmlDocument. Попробуй. Я зависим.
Спасибо за предложение. Обязательно попробую.
Мы можем преобразовать xml в строку, удалить xmlns из этой строки, а затем создать другой XmlDocument, используя эту строку, в которой не будет пространства имен.
Я видел различные варианты в этом потоке и пришел к своему собственному решению по удалению атрибутов xmlns в xml. Это работает правильно и без проблем:
'Remove the Equifax / Transunian / Experian root node attribute that have xmlns and load xml without xmlns attributes.
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then
objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, ""))
objXMLDom.DocumentElement.RemoveAllAttributes()
ResponseXML = objXMLDom.OuterXml
End If
Больше ничего делать для удаления xmlns из xml не требуется.
Большое спасибо Али Шаху, эта ветка отлично решила мою проблему! вот преобразование C#:
var dom = new XmlDocument();
dom.Load("C:/ExampleFITrade.xml));
var loaded = new XDocument();
if (dom.DocumentElement != null)
if ( dom.DocumentElement.NamespaceURI != String.Empty)
{
dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, ""));
dom.DocumentElement.RemoveAllAttributes();
loaded = XDocument.Parse(dom.OuterXml);
}
public static string RemoveXmlns(string xml)
{
//Prepare a reader
StringReader stringReader = new StringReader(xml);
XmlTextReader xmlReader = new XmlTextReader(stringReader);
xmlReader.Namespaces = false; //A trick to handle special xmlns attributes as regular
//Build DOM
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlReader);
//Do the job
xmlDocument.DocumentElement.RemoveAttribute("xmlns");
//Prepare a writer
StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter);
//Optional: Make an output nice ;)
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.IndentChar = ' ';
xmlWriter.Indentation = 2;
//Build output
xmlDocument.Save(xmlWriter);
return stringWriter.ToString();
}
Было бы полезно небольшое повествовательное описание предложенного вами ответа.
вот мое решение на vb.net, ребята!
Dim pathXmlTransformado As String = "C:\Fisconet4\process79094100019215387-1387_transformado.xml"
Dim nfeXML As New XmlDocument
Dim loaded As New XDocument
nfeXML.Load(pathXmlTransformado)
nfeXML.LoadXml(nfeXML.OuterXml.Replace(nfeXML.DocumentElement.NamespaceURI, ""))
nfeXML.DocumentElement.RemoveAllAttributes()
Dim dhCont As XmlNode = nfeXML.CreateElement("dhCont")
Dim xJust As XmlNode = nfeXML.CreateElement("xJust")
dhCont.InnerXml = 123
xJust.InnerXml = 123777
nfeXML.GetElementsByTagName("ide")(0).AppendChild(dhCont)
nfeXML.GetElementsByTagName("ide")(0).AppendChild(xJust)
nfeXML.Save("C:\Fisconet4\process79094100019215387-1\teste.xml")
Я просто столкнулся с этой проблемой. Хорошая находка!