如何使用 .NET XML API 删除 xmlns 属性

Posted

技术标签:

【中文标题】如何使用 .NET XML API 删除 xmlns 属性【英文标题】:How to remove xmlns attribute with .NET XML API 【发布时间】:2010-09-09 17:42:50 【问题描述】:

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 中删除。 我猜是因为这个属性的特殊含义。

问题是。 显然我可以从这个字符串表示中删除属性,但我想知道是否可以使用 API 做同样的事情。

@Edit:我说的是 .NET 2.0。

【问题讨论】:

我刚遇到这个问题。很好的发现! 【参考方案1】:

非常感谢 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);
            

【讨论】:

【参考方案2】:

.NET DOM API 不支持修改元素的命名空间,而这实际上是您想要做的。因此,为了解决您的问题,您必须以一种或另一种方式构建一个新文档。您可以使用相同的 .NET DOM API 并创建一个新元素,而无需指定其命名空间。或者,您可以创建一个 XSLT 样式表,将您原来的“命名空间”文档转换为一个新的文档,其中的元素将不是命名空间限定的。

【讨论】:

我不确定,但只要没有肯定的答案,我相信是真的。【参考方案3】:

这不是应该删除命名空间吗?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");

但无论如何,System.Xml.Linq 命名空间 (.Net 3.0) 中的 XElement、XDocument 和 XNameSpace 类比旧的 XmlDocument 模型要好很多。搏一搏。我上瘾了。

【讨论】:

感谢您的建议。一定会试一试的。【参考方案4】:

我在这个线程中看到了各种选项,并来解决我自己的解决方案,用于删除 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。

【讨论】:

【参考方案5】:
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();

【讨论】:

对您提出的答案进行简短的叙述性描述会有所帮助。【参考方案6】:

是的,因为它是一个 ELEMENT 名称,所以您不能明确删除它。使用 XmlTextWriter 的 WriteStartElement 和 WirteStartAttribute,并用空格替换属性可能会完成工作。

我现在正在检查。会更新的。

【讨论】:

【参考方案7】:

也许通过 XmlNamespaceManager ? http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.removenamespace.aspx 但这只是猜测。

【讨论】:

我已经尝试过了,但无法弄清楚如何使用此类删除命名空间。【参考方案8】:

我们可以将 xml 转换为字符串,从该字符串中删除 xmlns,然后使用该字符串创建另一个 XmlDocument,它不会有命名空间。

【讨论】:

【参考方案9】:

这是我在 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")

【讨论】:

以上是关于如何使用 .NET XML API 删除 xmlns 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WEB API 请求和响应 XML 中删除命名空间?

如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?

VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement

如何指定在 ASP.NET Web API 中是需要 JSON 还是 XML?

ASP.NET Core 1.0 Web API 不返回 XML

使用 Json.Net 转换为 XML 时如何序列化空数组