2015-02-08 66 views
0

在以下XML中,有两组节点具有相同的TxnID。使用linq to XML如何删除重复的PurchaseOrderRet节点。如何删除linq中的重复节点到xml文档

<?xml version="1.0"?> 
<QBPOSXML> 
    <QBPOSXMLMsgsRs> 
    <PurchaseOrderQueryRs> 
     <PurchaseOrderRet> 
     <TxnID>abc</TxnID> 
     </PurchaseOrderRet> 
    </PurchaseOrderQueryRs> 
    <PurchaseOrderQueryRs> 
     <PurchaseOrderRet> 
     <TxnID>xyz</TxnID> 
     </PurchaseOrderRet> 
    </PurchaseOrderQueryRs> 
    <PurchaseOrderQueryRs> 
     <PurchaseOrderRet> 
     <TxnID>abc</TxnID> 
     </PurchaseOrderRet> 
     <PurchaseOrderRet> 
     <TxnID>def</TxnID> 
     </PurchaseOrderRet> 
     <PurchaseOrderRet> 
     <TxnID>xyz</TxnID> 
     </PurchaseOrderRet> 
    </PurchaseOrderQueryRs> 
    </QBPOSXMLMsgsRs> 
</QBPOSXML> 

回答

1

您可以使用此声明:

XDocument doc = XDocument.Load(@"mypath\MyFile.xml"); 

到XML加载到XDocument对象。

您可以使用GroupBy来识别重复的​​元素。应用下列操作到doc后:

doc.Descendants("PurchaseOrderRet") 
    .GroupBy(p => p.Element("TxnID").Value) 
    .Where(g => g.Count() > 1) 
    .ToList() 
    .ForEach(x => x.Skip(1).Remove()); 

doc持有以下XML:

- <QBPOSXML> 
    - <QBPOSXMLMsgsRs> 
    - <PurchaseOrderQueryRs> 
     - <PurchaseOrderRet> 
      <TxnID>abc</TxnID> 
     </PurchaseOrderRet> 
     </PurchaseOrderQueryRs> 
    - <PurchaseOrderQueryRs> 
     - <PurchaseOrderRet> 
      <TxnID>xyz</TxnID> 
     </PurchaseOrderRet> 
     </PurchaseOrderQueryRs> 
    - <PurchaseOrderQueryRs> 
     - <PurchaseOrderRet> 
      <TxnID>def</TxnID> 
     </PurchaseOrderRet> 
     </PurchaseOrderQueryRs> 
    </QBPOSXMLMsgsRs> 
    </QBPOSXML>