使用XElement循环c#中的每个项目

时间:2018-10-04 14:03:37

标签: c# linq xmldocument xdoc

在交换C#idItem列表中的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?
}

请让我知道您的建议。

1 个答案:

答案 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()扩展方法,但是如果需要,您可以自己编写。