C# 如何从XElement创建的节点中删除空xmlns属性
这是我的代码:C# 如何从XElement创建的节点中删除空xmlns属性,c#,.net,xml,linq-to-xml,C#,.net,Xml,Linq To Xml,这是我的代码: XElement itemsElement = new XElement("Items", string.Empty); //some code parentElement.Add(itemsElement); 之后我得到了这个: <Items xmlns=""></Items> 父元素没有任何命名空间。我能做些什么,在没有空名称空间属性的情况下获得Items元素?关键在于如何处理名称空间。下面的代码使用不同的命名空间创建子项: XNamespac
XElement itemsElement = new XElement("Items", string.Empty);
//some code
parentElement.Add(itemsElement);
之后我得到了这个:
<Items xmlns=""></Items>
父元素没有任何命名空间。我能做些什么,在没有空名称空间属性的情况下获得
Items
元素?关键在于如何处理名称空间。下面的代码使用不同的命名空间创建子项:
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>
看看
child1
、child2
和child3
之间的区别child2
是使用默认名称空间创建的,这可能是您想要的,而child3
是您现在拥有的名称空间。没有显式名称空间的父项可能意味着它从祖先继承它。祖先链中是否有任何元素公开名称空间?是。有些父母有名字空间。但项目的直接父项却没有。另外。Items的每个元素都没有名称空间。如果您正在查找,则可以尝试删除XElement构造函数中的string.Empty。@ogrod,那么您应该设置与最近的祖先元素中定义的名称空间相同的名称空间,即,如果您有
,则应该应用xmlns=“urn:foo”
也添加到
元素。如果元素与父元素具有相同的默认命名空间,则它不应具有xmlns
属性。您是否试图手动设置该属性,而不是使用XNamespace
?您可以发布已定义命名空间的祖先元素的标记吗?我认为此答案中的代码将导致“System.Xml.XmlException:'名称中不能包含“:”字符,十六进制值0x3A”。“
。为了避免这种情况,请使用newxelement(XName.Get(“child1”,otherNs))代码>代替新的元素(otherNs+“child1”)代码>@cedd你试过了吗?它在我的机器上工作。实际上,Console.Out.WriteLine(root.ToString())代码>产生了我在上面的答案中所显示的内容。我在.NETFramework4.6.2上的一个控制台应用程序中运行这个。您是如何得到此错误的?@cedd好的,如果在声明名称空间时使用var
,我可以强制执行此错误。然后它们将变成string
s,这将不起作用。它们必须显式输入为XNamespace
。伙计,我爱你。这是一个完整的例子。“你帮了我很多……我也爱你,”SubqueryCrunch说。