Зацикливание каждого элемента в C# с помощью XElement
Я сталкиваюсь с некоторыми трудностями в обмене 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
ссылка на базовый атрибут 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()
метод расширения, но если вам нужно, вы можете легко написать его самостоятельно.