0

我在交换C# 中 sid列表中的属性时遇到了一些困难。是参考。ItemXDocumentid

输入:

<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>,其中一部分 value是1st 和 2nd的Base属性的ex:bookref1引用。book_bookref1_ref1 Item

我需要将第二个“id”Item写入第一个并将第一个写入循环中id的第二个。Item同样适用于 3rd 和 4th Item。可以有很多,但它就像一个组合(1 和 2、3 和 4、5 和 6 等)。

这里的问题是可以有多个s 并且映射属性Item中没有关系。ItemId

我正在使用的代码正在加载XMLDocument到LINQ 中XDocument获取Items 。

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?
}

请让我知道你的建议。

4

1 回答 1

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);
}

这枚举不是 each Item,不是每Item对(一批中的两个元素)。您只需要调整它来决定如果奇数元素留在循环结束时该怎么做。

MoreLinq 用于.Batch()扩展方法,但如果您需要,您可以自己轻松编写。

于 2018-10-04T14:38:20.660 回答