【问题标题】:How to get latest node details by using xmldocument?如何使用 xmldocument 获取最新的节点详细信息?
【发布时间】:2015-12-15 06:01:01
【问题描述】:

我有如下的 xml 文件。

<Root>
      <Main Name="Install">
        <Details>Success</Details>
        <Maintain>Install period</Maintain>
      </Main>
    <Main Name="Uninstall">
        <Details>failure</Details>
        <Maintain>uninstall period</Maintain>
      </Main>
     <Main Name="Discard">
        <Details>failure</Details>
        <Maintain>discard period</Maintain>
      </Main>
     <Main Name="Install">
        <Details>Done</Details>
        <Maintain>Got Output</Maintain>
      </Main>
    </Root>

我只需要最后一次更新以在 xml 中打印。

我使用了以下 xdocument(使用 system.xml.Linq)代码并找到了输出。

XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");

var elemsNew = xDoc1.Element("Root").Elements("Main")
    .GroupBy(x => x.Attribute("Name").Value)
    .Select(g => g.Last())
    .ToArray();

XDocument xDoc2 = new XDocument(new XElement("Root", elemsNew));
xDoc2.Save(@"C:\Output.xml");

输出如下:

<Root>
 <Main Name="Uninstall">
   <Details>failure</Details>
    <Maintain>uninstall period</Maintain>
 </Main>
 <Main Name="Discard">
    <Details>failure</Details>
    <Maintain>discard period</Maintain>
 </Main>
<Main Name="Install">
    <Details>Done</Details>
    <Maintain>Got Output</Maintain>
 </Main>
</Root>

但是不使用 xdocument 是否有任何选项可以通过 xmldocument(使用 system.xml)获取此输出?我只需要通过 xmldocument 输出。

【问题讨论】:

    标签: c# xml xmldocument


    【解决方案1】:

    您可以手动完成。只需从头到尾遍历您的 Main 元素,删除已满足 Name 属性的所有项目。

    var document = new XmlDocument();
    document.LoadXml(xmlString);
    
    Dictionary<string, bool> used = new Dictionary<string, bool>();
    
    var allNodes = document.SelectNodes("Root/Main");
    
    for (int i = allNodes.Count - 1; i >= 0; i--)
    {
        var name = ((XmlElement)allNodes[i]).GetAttribute("Name");
    
        if (used.ContainsKey(name))
        {
            allNodes[i].ParentNode.RemoveChild(allNodes[i]);
        }
        else
        {
            used.Add(name, true);
        }
    }
    
    Console.WriteLine(document.OuterXml);
    

    这是工作的IDEOne demo

    但是,正如我在 cmets 中已经提到的,使用 XDocument 是一个非常好的主意,因为它更方便,而且很现代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2010-12-25
      • 1970-01-01
      • 2013-11-08
      • 2015-01-10
      相关资源
      最近更新 更多