Добавить XDocument.Root к другому XElement, который не работает должным образом - PullRequest
0 голосов
/ 08 мая 2018

так что я делаю некоторые манипуляции с XML и попал в странную ситуацию. После добавления XElement с нулевым Parent к другому XElement у меня все еще оставалось значение Narent для Parent. Поэтому после некоторого тестирования я обнаружил проблему, но не совсем понял, как она работает.

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, XElement копируется, и вам необходимо вызвать Remove перед добавлением. Документация говорит, что Remove должен выдавать исключение, когда Parent имеет значение null, но вместо этого в этом случае кажется, что он удаляет связь между XDocument и его корнем. Правильна ли эта интерпретация или есть другое объяснение?

1 Ответ

0 голосов
/ 08 мая 2018

Слово parent не означает одно и то же в отношении свойства XObject.Parent и метода XNode.Remove ().

В случае свойства XObject.Parent он возвращает родительский XElement XObject. Поэтому, если родительский объект XObject не относится к типу XElement, он вернет значение null. В вашем примере узел «asd» имеет родителя, но поскольку он имеет тип XDocument вместо XElement, он возвращает ноль.

Метод XNode.Remove удаляет объект XNode из его «родителя». Например, он работает с любым типом, который наследуется от XNode.

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