在交换C#id
中Item
列表中的XDocument
属性时,我遇到了一些困难。 id
是参考。
输入:
<Items>
<Item base="book_bookref1_ref1">
<Name>Test1</Name>
<Ref>bookref1</Ref>
</Item>
<Item base="book_bookref1_ref2">
<Name>Test2</Name>
<Ref>bookref1</Ref>
</Item>
<Item base="book_bookref2_ref1">
<Name>Test3</Name>
<Ref>bookref2</Ref>
</Item>
<Item base="book_bookref2_ref2">
<Name>Test4</Name>
<Ref>bookref2</Ref>
</Item>
</Items>
预期输出:
<Items>
<Item base="book_bookref1_ref1" id="book_bookref1_ref2">
<Name>Test1</Name>
<Ref>bookref1</Ref>
</Item>
<Item base="book_bookref1_ref2" id="book_bookref1_ref1">
<Name>Test2</Name>
<Ref>bookref1</Ref>
</Item>
<Item base="book_bookref2_ref1" id="book_bookref2_ref2">
<Name>Test3</Name>
<Ref>bookref2</Ref>
</Item>
<Item base="book_bookref2_ref2" id="bookref2_ref1">
<Name>Test4</Name>
<Ref>bookref2</Ref>
</Item>
</Items>
有一个标签<Ref>
,其中值ex:bookref1
的一部分是第一和第二的 Base 属性book_bookref1_ref1
的引用。 strong> Item
。
我需要在循环中将第二个'id'写入第一个Item
并将第一个id
写入第二个Item
。对于第三和第四Item
同样。可以有很多,但这就像一个组合(1和2、3和4、5和6等)。
这里的问题是可以有多个Item
,并且Item
中没有关联来映射Id
属性。
我正在使用的代码将XMLDocument
加载到XDocument
中,从而在LINQ中获得Item
s。
Var doc = XDocument.Load(xml)
var ItemsList
foreach(var itm in ItemsList)
{
// I'm stuck here. How do we get the id attribute value based on Ref tag?
}
请让我知道您的建议。
答案 0 :(得分:0)
使用少量的LINQ(在此示例中为MoreLinq),XML不可能没有:
var xdoc = XDocument.Parse(input);
foreach(var pair in xdoc.XPathSelectElements("Items/Item").Batch(2).ToArray())
{
pair[0].SetAttributeValue(XName.Get("id"), pair[1].Attribute(XName.Get("base")).Value);
pair[1].SetAttributeValue(XName.Get("id"), pair[0].Attribute(XName.Get("base")).Value);
}
这不是枚举每个Item
,也不是每个Item
对(一批中的两个元素)。您只需要对此进行调整,以决定如果在循环的末尾保留了奇数元素该怎么办。
MoreLinq用于.Batch()
扩展方法,但是如果需要,您可以自己编写。