Зацикливание каждого элемента в C # с помощью XElement - PullRequest
0 голосов
/ 04 октября 2018

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

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

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

Используемый код загружает XMLDocument в XDocument, получая Item s в 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 Ответ

0 голосов
/ 04 октября 2018

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

...