代码之家  ›  专栏  ›  技术社区  ›  Jake

从xdocument中删除节点

  •  9
  • Jake  · 技术社区  · 14 年前

    这将删除文档中的所有元素:

            XDocument document = XDocument.Load(inputFile);
            foreach (XElement element in document.Elements())
            {
                element.Remove();
            }
            document.Save(outputFile);
    

    这没有任何效果:

            XDocument document = XDocument.Load(inputFile);
            foreach (XElement element in document.Elements())
            {
                //element.Remove();
                foreach (XElement child in element.Elements())
                    child.Remove();
            }
            document.Save(outputFile);
    

    我是不是错过了什么?因为这些都是对xdocument中元素的引用,所以这些更改是否会生效?是否有其他方法可以从xdocument中移除嵌套的子级?

    谢谢!

    3 回复  |  直到 13 年前
        1
  •  19
  •   Jake    14 年前

    显然,当你重复 element.Elements() 调用一个 Remove() 在其中一个子元素上导致枚举器 yield break . 迭代 element.Elements().ToList() 解决了问题。

        2
  •  2
  •   Tahbaza    14 年前

    下面是使用system.xml.xpath的另一种方法的示例(根据需要更改xpath查询):

    const string xml = 
        @"<xml>
            <country>
                <states>
                    <state>arkansas</state>
                    <state>california</state>
                    <state>virginia</state>
                </states>
            </country>
        </xml>";
    XDocument doc = XDocument.Parse(xml);
    doc.XPathSelectElements("//xml/country/states/state[.='arkansas']").ToList()
       .ForEach(el => el.Remove());;
    Console.WriteLine(doc.ToString());
    Console.ReadKey(true);
    
        3
  •  2
  •   Oleks    13 年前

    使用时 XDocument 试试这个:

    XDocument document = XDocument.Load(inputFile);
    foreach (XElement element in document.Elements())
    {
         document.Element("Root").SetElementValue(element , null);
    }
    document.Save(outputFile)
    

    当做, 托德