如何从 XElement 创建的节点中删除空的 xmlns 属性

Posted

技术标签:

【中文标题】如何从 XElement 创建的节点中删除空的 xmlns 属性【英文标题】:How can I remove empty xmlns attribute from node created by XElement 【发布时间】:2012-08-15 20:10:51 【问题描述】:

这是我的代码:

XElement itemsElement = new XElement("Items", string.Empty);
//some code
parentElement.Add(itemsElement);

之后我得到了这个:

<Items xmlns=""></Items>

父元素没有任何命名空间。我该怎么做才能获得没有空命名空间属性的Items 元素?

【问题讨论】:

没有显式命名空间的父级可能意味着它从祖先那里继承。祖先链中的任何元素是否公开了命名空间? 是的。一些父母有命名空间。但是 Items 的直接父级没有。更重要的是。 Items 的每个元素都没有命名空间。 如果您正在寻找 ,那么您可以尝试在 XElement 构造函数中删除 string.Empty。 @ogrod,那么您应该设置与最近的祖先元素中定义的名称空间相同的名称空间,即如果您有&lt;ancestor xmlns="urn:foo"&gt;&lt;!-- other elements... --&gt;&lt;item&gt;&lt;/item&gt;&lt;!-- other elements... --&gt;&lt;/ancestor&gt;,那么您应该将xmlns="urn:foo" 应用于&lt;item&gt; 元素好吧。 如果元素与父元素有相同的默认命名空间,那么它不应该有xmlns 属性。您是否尝试手动设置该属性而不是使用XNamespace?你能发布定义了命名空间的祖先元素的标记吗? 【参考方案1】:

这完全取决于您如何处理命名空间。下面的代码创建了具有不同命名空间的子项:

XNamespace defaultNs = "http://www.tempuri.org/default";
XNamespace otherNs = "http://www.tempuri.org/other";

var root = new XElement(defaultNs + "root");
root.Add(new XAttribute(XNamespace.Xmlns + "otherNs", otherNs));

var parent = new XElement(otherNs + "parent");
root.Add(parent);

var child1 = new XElement(otherNs + "child1");
parent.Add(child1);

var child2 = new XElement(defaultNs + "child2");
parent.Add(child2);

var child3 = new XElement("child3");
parent.Add(child3);

它将生成如下所示的 XML:

<root xmlns:otherNs="http://www.tempuri.org/other" xmlns="http://www.tempuri.org/default">
    <otherNs:parent>
        <otherNs:child1 />
        <child2 />
        <child3 xmlns="" />
    </otherNs:parent>
</root>

看看child1child2child3之间的区别。 child2 是使用默认命名空间创建的,这可能是您想要的,而 child3 是您现在拥有的。

【讨论】:

我认为这个答案中的代码将导致"System.Xml.XmlException: 'The ':' character, hexadecimal value 0x3A, cannot be included in a name.'"。为避免这种情况,请使用 new XElement(XName.Get("child1", otherNs)); 代替 new XElement(otherNs + "child1"); @cedd 你试过了吗?它适用于我的机器。事实上,Console.Out.WriteLine(root.ToString()); 产生的正是我在上面的答案中显示的内容。我在.Net Framework 4.6.2 上的控制台应用程序中运行它。你做了什么导致这个错误? @cedd 好的,如果我在声明命名空间时使用var,我可以强制执行该错误。然后它们将变为strings,这将不起作用。它们必须明确键入为XNamespace 哥们,我爱你。这样一个完整的例子。你帮了我很多... 我也爱你,@SubqueryCrunch。 ?很高兴能帮上忙。新年快乐,祝你工作顺利。

以上是关于如何从 XElement 创建的节点中删除空的 xmlns 属性的主要内容,如果未能解决你的问题,请参考以下文章

Linq to Xml:删除命名空间

从 XElement 中删除属性

如何在c#中使用xelement获取xml节点值

如何确定 XElement.Elements() 是不是包含具有特定名称的节点?

Linq-to-XML XElement.Remove() 留下不需要的空白

C#:如何从 XElement 中获取名称(带前缀)作为字符串?