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

问题描述:

我有如下的xml文件。如何使用xmldocument获取最新的节点详细信息?

<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是否存在被(使用的system.xml)由XmlDocument的得到这个输出任何选项,但?我只需要输出xmldocument。

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

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

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