私はこのようなXMLドキュメントを持っています
<root>
<item id="1" creator="me">
<childA>1</childA>
<childB>2</childB>
</item>
<item id="2" creator="me">
<childA>1</childA>
<childB>3</childB>
<childB>4</childB>
</item>
</root>
重複するアイテムを見つけようとしています。次に、このようなロジックを使用して、重複するアイテムの子アイテムを複製します。
XDocument XmlRoot //whatever...you get the point
// Get item nodes
var items = XmlRoot.Descendants("item");
// Find duplicate items keys using creator attribute
var duplicateItemKeys = items.GroupBy(x => x.Attribute("creator").Value)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
foreach(var duplicateItemKey in duplicateItemKeys)
{
// Get the duplicate item XML elements using the duplicate keys
var duplicateItems = items.Where(x => x.Attribute("creator").Value == duplicateToucheKey)
.OrderBy(xelement => xelement.Attribute("CreatedOn").Value);
}
これは機能しますが、後でduplicateItemsを使用しようとすると問題が発生します。(foreachduplicateItemsのように)列挙するときはいつでも、最初のアイテムはその子のコンテキストを失います。2つ目は問題ありません。
たとえば、コードの後半で私は言います
var allItemB = new List<XElement>();
foreach (duplicateItem in duplicateItems)
{
allItemB.AddRange(duplicateItem.Descendants("childB"));
}
「allItemB」には、最初のパスで2が含まれ、2番目のパスで234が含まれると予想されます。結局のところ、duplicateItems配列が列挙されると、最初のXElementがその子を失うため、34個しか含まれていません。
誰かがこれを修正する方法を知っていますか?