将XDocument.Root添加到另一个未按预期工作的XElement

时间:2018-05-08 14:37:35

标签: c# .net xelement

所以我做了一些xml操作,我发现自己处于一种奇怪的境地。在将一个带有null Parent的XElement添加到另一个XElement之后,我仍然将Parent设置为null。经过一些测试后,我对这个问题很感兴趣,但我并不清楚这个行为。

XDocument x=new XDocument(new XElement("asd"));
XElement root=x.Root;
XElement parent=new XElement("parent");
Console.WriteLine(root.Parent?.Name??"null"); //still null
parent.Add(root);
Console.WriteLine(root.Parent?.Name??"null"); //should be 
root.Remove(); // should throw InvalidOperationException
parent.Add(root);
Console.WriteLine(root.Parent?.Name??"null");//parent

当您添加XElement作为XDocument的Root时,似乎复制了XElement,您需要在添加之前调用Remove。文档说,当Parent为null时,Remove应抛出异常,但在这种情况下,它似乎正在删除XDocument与其根之间的关系。这种间隔是正确的还是有其他解释?

1 个答案:

答案 0 :(得分:0)

对于XObject.Parent属性和XNode.Remove()方法,单词parent并不意味着相同。

对于XObject.Parent属性,它返回XObject的父XElement。因此,如果XObject的父级不是XElement类型,则它将返回null。在您的示例中,“asd”节点具有父节点,但由于它是XDocument类型而不是XElement,因此它返回null。

XNode.Remove方法从其父级中删除XNode对象。例如,它适用于任何继承自XNode的类型。

    XElement node1 = new XElement("node1");
    XComment comment1 = new XComment("comment1");
    node1.Add(comment1);
    comment1.Remove();