如何删除 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>
下面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>