【问题标题】:How to remove a XMLNode from XMLDocument occuring at multiple nested levels如何从发生在多个嵌套级别的 XMLDocument 中删除 XMLNode
【发布时间】:2015-03-22 03:20:00
【问题描述】:

我有一个 XML,它有一个节点,该节点使用 C# 在文件中的多个级别重复。

XML 示例:

<books>
    <book>
        <title>The Walking Dead</title>
        <author>Test Name</author>
        <isbn>1239859895</isbn>
    </book>
    <book>
        <title>The Walking Dead</title>
        <author>
            <isbn>29893893893</isbn>
            <firstname>test1</firstname>
            <lastname>test</lastname>
        </author>
    </book>        
</books>

我想从这个 XML 文档中删除所有 isbn 节点,无论其位置如何。

【问题讨论】:

  • 您的问题太含糊,因为我们不知道您在 XML 工作的其余部分使用什么策略。如果我们能给您一个适合您当前项目的答案,那就更好了。我们也不知道这个 XML 是字符串还是文件。
  • 您的 XML 有点损坏。 &lt;lastname&gt;test&lt;/test&gt; 应该是 &lt;lastname&gt;test&lt;/lastname&gt;
  • 我可以使用 XDocument 或 XMLDocument。
  • 修复了 XML 以拥有正确的节点。

标签: c# xml xmldocument xmlnode


【解决方案1】:

正如您指出您正在使用XmlDocument,您需要通过父节点上的RemoveChild 方法删除子XmlElement 节点:

    string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <books>
            <book>
                <title>The Walking Dead</title>
                <author>Test Name</author>
                <isbn>1239859895</isbn>
            </book>
            <book>
                <title>The Walking Dead</title>
                <author>
                    <isbn>29893893893</isbn>
                    <firstname>test1</firstname>
                    <lastname>test</lastname>
                </author>
            </book>        
        </books>
        ";
    // Initialize and load the XmlDocument
    var doc = new XmlDocument();
    doc.LoadXml(xml);

    // Delete all XmlElements named "isbn".
    var list = doc.DocumentElement.GetElementsByTagName("isbn").OfType<XmlElement>().ToArray();
    foreach (var element in list)
    {
        var parent = element.ParentNode;
        if (parent != null)
            parent.RemoveChild(element);
    }
    var newXml = doc.OuterXml;
    Debug.WriteLine(newXml);

输出是:

<?xml version="1.0" encoding="utf-16"?>
<books>
  <book>
    <title>The Walking Dead</title>
    <author>Test Name</author>
  </book>
  <book>
    <title>The Walking Dead</title>
    <author>
      <firstname>test1</firstname>
      <lastname>test</lastname>
    </author>
  </book>
</books>

【讨论】:

    【解决方案2】:

    最简单的方法是使用 XDocument 而不是 XmlDocument。使用 .Descendants() 查找特定名称/类型的所有节点。然后 .Remove() 他们。

    string xml = @"<books>
         <book>
             <title>The Walking Dead</title>
             <author>Test Name</author>
             <isbn>1239859895</isbn>
         </book>
         <book>
             <title>The Walking Dead</title>
             <author>
                 <isbn>29893893893</isbn>
                 <firstname>test1</firstname>
                 <lastname>test</lastname>
             </author>
         </book>        
     </books>";
    
    XDocument xdoc = XDocument.Parse(xml);
    xdoc.Descendants("isbn").Remove();
    string result = xdoc.ToString();
    

    但是,如果您想使用 XmlDocument,请使用以下代码:

     XmlDocument xmldoc = new XmlDocument();
     xmldoc.LoadXml(xml);
     foreach (var node in new  List<XmlNode>(xmldoc.GetElementsByTagName("isbn")
                                             .OfType<XmlNode>()).Where(
                                             x => x.ParentNode != null))
     {
         node.ParentNode.RemoveChild(node);                      
     }
    
     string result = xmldoc.OuterXml;
    

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多