2015-02-08 77 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>