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

时间:2015-02-08 16:25:45

标签: linq linq-to-xml

在以下XML中,有两组具有相同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>

1 个答案:

答案 0 :(得分:1)

您可以使用以下声明:

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>