所以我做了一些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与其根之间的关系。这种间隔是正确的还是有其他解释?
答案 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();