在XDocument中移动节点

3
我希望你能帮我找到一个具有特定属性的节点,并将其移动到底部。
XNode node = doc.Root.Elements().Where(e => e.Attribute("id").Value == "123").FirstOrDefault();
if (node != null)
{
    node.Root.Elements().Where(s => e.Attribute("id").Value == "123").Remove();
    doc.Root.Add(node);
}

这种方法并不总是有效。在.Remove()行上,有时会出现nullReferenceException异常。所以我猜这意味着它匹配并获取了FirstOrDefault()的节点,但是同样的linq查询两行后没有匹配到任何内容。我不明白这是怎么可能的。我是否漏掉了什么?这个文档也没有被同时访问或者其他操作。


弄清楚了,有一些节点的id属性不存在。 - mike
1个回答

1
请使用这个样本
 var foos = (from xElem in xDoc.Root.Descendants("Foo")
                       where xElem.Attribute("id").Value == "2" || xElem.Attribute("id").Value == "3"
                       select xElem).ToList();

            var newParentElem = (from xElem in xDoc.Root.Descendants("SubSection")
                                where xElem.Attribute("id").Value == "C"
                                select xElem).Single();

            foreach(var xElem in foos)
            {
                xElem.Remove();
                newParentElem.Add(xElem);
            }

好的,但我的问题比那个简单得多。我想将一个节点移动到同一父节点的底部。为什么我的代码不起作用? - mike
实际上,我所做的与那个完全相同,只是我使用的是SingleOrDefault()而不是Single,然后再检查是否为空,因为在我的情况下节点可能不存在。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接