【问题标题】:Removing XML Nodes by Comparing the List items通过比较列表项删除 XML 节点
【发布时间】:2020-05-08 16:44:09
【问题描述】:

我一直致力于从 XML 字符串中删除几个 XML 节点。我的要求是删除与列表项匹配的 XML 节点。我试图获取 childNodes 并检查 childNode 的名称是否在属性列表中。我已经生成了存在于 MovieDetails 类中的属性列表。

public class MovieDetails 
    {
        public string MovieName { get; set; }
        public string MovieId { get; set; }
        public string MovieGenre { get; set; }
    }

MyXml:

<MovieContent>
  <MovieDetails>
      <MovieName>Movie_Name_1</MovieName>
      <MovieId>MovieId_1</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre>
      <AdditionalInformation>HAHAHHAHA</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <MovieName>Movie_Name_2</MovieName>
      <MovieId>MovieId_2</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre> 
      <AdditionalInformation>FOOOO</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <MovieName>Movie_Name_3</MovieName>
      <MovieId>MovieId_3</MovieId>
      <MovieGenre>MovieGenre_3</MovieGenre> 
      <AdditionalInformation></AdditionalInformation>
  </MovieDetails>
</MovieContent>

我尝试使用 for 循环,但无法获得我想要的结果。但是从下面的代码中,我每次都可以在 1 个节点上删除。

 var movieDetailsNode = xmlContent.DocumentElement.ChildNodes;
 var properties = typeof(MovieDetails).GetProperties().Select(x => x.Name).ToList();
    foreach (XmlNode node in movieDetailsNode )
    {
       var childNodeList = node.ChildNodes;
       for (int i = 0; i < childNodeList.Count; i++)
       {
           var childNodeName = childNodeList[0].Name;
           if (properties.Contains(childNodeName))
           {
               childNodeList[i].ParentNode.RemoveChild(childNodeList[i]);
           }
        }
     }

任何人都可以帮助实现以下结果 xml

生成的 XML:

<MovieContent>
  <MovieDetails>
      <AdditionalInformation>HAHAHHAHA</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <AdditionalInformation>FOOOO</AdditionalInformation>
  </MovieDetails>
  <MovieDetails>
      <AdditionalInformation></AdditionalInformation>
  </MovieDetails>
</MovieContent>

【问题讨论】:

    标签: c# .net xml asp.net-core c#-4.0


    【解决方案1】:

    更简单的方法是使用System.Xml.Linq 命名空间中的LINQ to XML 从属性集合中删除节点。在这里使用 HashSet&lt;string&gt; 是有意义的,因为名称应该是唯一的,并且查找时间是恒定的而不是线性的。

    var properties = typeof(MovieDetails)
        .GetProperties()
        .Select(x => x.Name)
        .ToHashSet();
    
    // Or just var properties = new HashSet<string> { "MovieName", "MovieId", "MovieGenre" };
    
    var doc = XElement.Load(@"C:\input.xml");
    
    doc.Descendants("MovieDetails")
       .Elements()
       .Where(e => properties.Contains(e.Name.LocalName))
       .Remove();
    
    doc.Save(@"C:\output.xml");
    

    说明

    output.xml

    <MovieContent>
      <MovieDetails>
        <AdditionalInformation>HAHAHHAHA</AdditionalInformation>
      </MovieDetails>
      <MovieDetails>
        <AdditionalInformation>FOOOO</AdditionalInformation>
      </MovieDetails>
      <MovieDetails>
        <AdditionalInformation></AdditionalInformation>
      </MovieDetails>
    </MovieContent>
    

    【讨论】:

    • 是否有可能检索 List 中不存在的 xml 节点并存储在变量中
    【解决方案2】:

    这会起作用

                var movieDetailsNode = xmlContent.DocumentElement.ChildNodes;
                var properties = typeof(MovieDetails).GetProperties().Select(x => x.Name).ToList();
                foreach (XmlNode node in movieDetailsNode)
                {
                    var childNodeList = node.ChildNodes;
                    for (int i = 0; i < childNodeList.Count; i++)
                    {
                       // replace '0' with 'i'
                        var childNodeName = childNodeList[i].Name;
                        if (properties.Contains(childNodeName))
                        {                       
                            childNodeList[i].ParentNode.RemoveChild(childNodeList[i]);
                            // add decrement of 'i' here
                            i--;
                        }
                    }
                }
    

    【讨论】:

    • 当第 0 个节点被移除时。下一个节点处于第 0 个位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多