名称空间会传播到XElement对象中的子级吗?

时间:2020-03-05 18:48:26  来源:igfitidea点击:

如果我有一个带有子元素的XElement,并且如果我从父元素中删除了子元素,同时删除了两者之间的所有引用,那么子XElement是否具有与父元素相同的命名空间?

换句话说,如果我具有以下XML:

<parent xmlns:foo="abc">
    <foo:child />
</parent>

我删除了子元素,子元素的xml看起来像

<child xmlns="abc" />

或者喜欢

<child />

解决方案

回答

答案是肯定的,名称空间确实会传播到子级。

我们不必在子元素中指定名称空间。命名空间的作用域包括所有元素,直到定义该元素的元素的结束标记为止。

请参阅http://www.w3.org/TR/REC-xml-names/#scoping此处的#6.1节

希望能有所帮助

回答

如果在新的xml树中包含提到的元素,则它将在同一命名空间中。

var xml1 = XElement.Parse("<a xmlns:foo=\"abc\"><foo:b></foo:b></a>");
var xml2 = XElement.Parse("<a xmlns:boo=\"efg\"></a>");
XNamespace ns = "abc";
var elem = xml1.Element(ns + "b");
elem.Remove();
xml2.Add(elem);
Console.WriteLine(xml1.ToString());
Console.WriteLine(xml2.ToString());

结果:

<a xmlns:foo="abc" />
<a xmlns:boo="efg">
   <b xmlns="abc"></b>
</a>