如何使用XmlDocument获取最新的节点详细信息?

3
我有一个类似以下的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获得输出。
1个回答

2
你可以手动完成它。只需从末尾开始迭代你的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演示

然而,正如我在评论中已经提到的那样,使用XDocument是一个非常好的主意,因为它更方便,也更现代化。


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