如何使用.NET XML API删除xmlns属性
对于任意属性,XmlElement.Attributes.Remove *方法正常工作,从而导致从XmlDocument.OuterXml属性中删除已删除的属性。然而Xmlns属性是不同的。这里有一个例子:如何使用.NET XML API删除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/" />
属性似乎从属性集合中删除,但它不会从XmlDocument.OuterXml删除。 我想这是因为这个属性的特殊含义。
问题是如何使用.NET XML API删除xmlns属性。 很明显,我可以从字符串表示形式中删除属性,但我想知道是否可以使用API来做同样的事情。
@编辑:我在谈论.NET 2.0。
.NET DOM API不支持修改元素的名称空间,这正是您本质上想要做的。所以,为了解决你的问题,你必须以这样或那样的方式构建一个新的文档。您可以使用相同的.NET DOM API并创建一个新元素而不指定其名称空间。或者,您可以创建一个XSLT样式表,将原来的“命名空间”文档转换为其中元素不受命名空间限定的新文档。
我不确定,但只要没有肯定的答案,我相信这是真的。 – axk 2008-09-17 19:18:00
是的,因为它是ELEMENT名称,所以不能明确地将其删除。使用XmlTextWriter的WriteStartElement和WirteStartAttribute,并用空白替换属性可能会完成工作。
我正在查看它。将更新。
也许通过XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx但这只是一个猜测。
我试过这个,但一直未能弄清楚如何删除这个类的命名空间。 – axk 2008-09-16 20:39:02
是不是应该删除命名空间?
XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");
但无论如何,在这里切线的的XElement,和的XDocument从System.Xml.Linq的命名空间XNameSpace类(.NET 3.0)是一个更好的很多较老的XmlDocument模型。搏一搏。我上瘾了。
感谢您的建议。一定会试一试。 – axk 2008-09-17 19:16:57
我们可以将xml转换为字符串,从该字符串中移除xmlns,然后使用此字符串创建另一个XmlDocument,该字符串将不具有该名称空间。
我看到了这个线程中的各种选项,来解决我自己的解决方案,用于删除xml中的xmlns属性。这是正常工作,并没有问题:
'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
有没有必要做任何事情来从xml中删除xmlns。
非常感谢Ali Shah,这个主题完美地解决了我的问题! 这里有一个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();
}
对你提出的答案有一些叙述性描述会有帮助。 – Rob 2013-01-11 22:37:24
这里是我的vb.net家伙的解决方案!
Dim pathXmlTransformado As String = "C:\Fisconet4\process\11790941000192\2015\3\28\38387-1\38387_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\process\11790941000192\2015\3\28\38387-1\teste.xml")
我刚刚遇到了这个问题。好找! – 2009-10-23 21:41:21