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中删除。 我想这是因为这个属性的特殊含义。
问题是如何使用.NET XML API删除xmlns属性。 显然我可以从String的表示中删除该属性,但我想知道是否可以使用API执行相同的操作。
@Edit:我在谈论.NET 2.0。
答案 0 :(得分:2)
.NET DOM API不支持修改元素的命名空间,这是您基本上要尝试的操作。因此,为了解决您的问题,您必须以这种或那种方式构建新文档。您可以使用相同的.NET DOM API并创建新元素,而无需指定其名称空间。或者,您可以创建一个XSLT样式表,将原始的“命名空间”文档转换为新的文档,其中的元素不是名称空间限定的。
答案 1 :(得分:2)
我在这个线程中看到了各种选项,并且解决了我自己的解决方案,用于删除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中删除xml。
答案 2 :(得分:2)
非常感谢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);
}
答案 3 :(得分:1)
这不应该删除命名空间吗?
XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");
但无论如何,在这里切线,System.Xml.Linq命名空间(.Net 3.0)中的XElement,XDocument和XNameSpace类比旧的XmlDocument模型更好。搏一搏。我上瘾了。
答案 4 :(得分:1)
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();
}
答案 5 :(得分:0)
是的,因为它是一个ELEMENT名称,所以无法明确删除它。使用XmlTextWriter的WriteStartElement和WirteStartAttribute,并用空格替换属性可能会完成工作。
我现在正在检查它。将更新。
答案 6 :(得分:0)
也许通过XmlNamespaceManager? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx但这只是猜测。
答案 7 :(得分:0)
我们可以将xml转换为字符串,从该字符串中删除xmlns,然后使用不具有命名空间的字符串创建另一个XmlDocument。
答案 8 :(得分:0)
这是我在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")