2015-12-15 54 views
3

我有如下的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。

回答

2

您可以手動完成。只需遍歷你的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一個很好的主意,因爲它是更方便,它是現代的。

相關問題