如何删除 linq to xml 文档中的重复节点

How to remove duplicate nodes in linq to xml document

下面XML有2组节点有相同的TxnID。使用 linq to XML 如何删除重复的 PurchaseOrderRet 节点。

<?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>

你可以使用这个语句:

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

将 XML 加载到 XDocument 对象中。

您可以使用 GroupBy 来识别重复的 <TxnID> 元素。在 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>