【问题标题】:Remove xmlns attribute from xml从 xml 中删除 xmlns 属性
【发布时间】:2019-07-09 15:59:29
【问题描述】:

在下面的 xml 中,我试图删除 xmlns 属性,但是它无法在下面填充, xmlNode.Attributes 仍然出现在 outerxml 和最终 xmldocument 下。

... 
<z:Datac knid="2" xmlns="http://services/api/"></z:Datac>
...
<z:Datac knid="3" xmlns="http://services/api/"></z:Datac>
....
<z:Datac knid="5" xmlns="http://services/api/"></z:Datac>
....

如何删除每个 z:Datac 元素的 xmlns 属性。

foreach (var item in nodes)
                    {
                        var xmlnsAttribute = (item.Attributes has "xmlns" attribute)
                        if (xmlnsAttribute != null)
                        {
                            Remove xmlNode...  //not able to reach here as not able to find xmlns.
                        }
}

没有 xml.linq

【问题讨论】:

  • 你试过什么?你绑定XmlDocument吗?在XDocumentel.Attribute("xmlns")?.Remove(); 似乎工作......(显然在实际代码中,您希望针对元素的 .Name.Namespace 测试 xmlns,并且只有在不同时才删除)
  • 没有,linq.xml。它的普通 - xmldocument/xmlNode.
  • 上面的链接与 linq.xml 中的 xElement 一起使用。这里没有。
  • 是的,我正在撤消关闭重复;这是一个完全不同且不兼容的 API
  • 你从哪里得到这个 XML?看起来很可疑;冒号用于将 XML 命名空间与标签分开,xmlns 属性用于区分命名空间。但是这些在您的 XML 片段中都是错误的,z 命名空间从未定义,xmlns 属性未定义命名空间。要么这个 XML 不使用命名空间,要么严重损坏,要么你没有向我们展示实际的 XML。

标签: c# xml c#-4.0 xmldocument xmlnode


【解决方案1】:

你会想要这样的东西:

XmlDocument doc = new XmlDocument();
doc.Load("my.xml");
foreach(var node in doc.DocumentElement.ChildNodes)
{
    var el = node as XmlElement;
    if (el != null)
    {
        if (el.HasAttribute("xmlns"))
        {
            var ns = el.GetAttribute("xmlns");
            if (ns != null && ns != el.NamespaceURI)
            {
                el.RemoveAttribute("xmlns");
            }
        }
    }
}
doc.Save("new.xml");

显然,您可能希望在复杂的场景中使其查询,或发出全元素查询。

【讨论】:

  • 问题是,` if (el.HasAttribute("xmlns"))` 不成立,但是,el.OuterXml 有 xmlns 并且 namespaceURI 存在。
  • @dsi 我测试了它......它在这里工作得很好;如果您发现它在特定场景中失败,则使用代表性代码和 xml 发布该确切场景会有所帮助;如果您说它不适用于文档/根元素 - 很好:只需修复它!
猜你喜欢
  • 1970-01-01
  • 2016-03-25
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多