Зацикливание каждого элемента в C# с помощью XElement

Я сталкиваюсь с некоторыми трудностями в обмене id атрибут в списке Items в C# 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 ссылка на базовый атрибут book_bookref1_ref1 за 1 и 2 Item,

Мне нужно написать 2-е "идентификатор" к 1-му Item и написать 1-е id ко второму Item в петле. Аналогично для 3-го и 4-го Item, Их может быть много, но это как комбинация (1 и 2, 3 и 4, 5 и 6 и т. Д.).

Проблема здесь может быть несколько Itemи нет никакого отношения в Item нанести на карту Id приписывать.

Код, который я использую, загружается XMLDocument в XDocument получать Itemв LINQ.

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 ответ

Ничего в XML невозможно с небольшим LINQ (и MoreLinq, в этом примере):

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() метод расширения, но если вам нужно, вы можете легко написать его самостоятельно.

Другие вопросы по тегам