Как объединить значения узлов из разных узлов в один узел, разделенный символом «/» через каждые 2 значения - PullRequest
2 голосов
/ 14 октября 2019

У меня есть следующий XML:

 <root>
        <table>
            <items>Item 1</items>
            <values>value 1></values>
        </table>
        <table>
            <items>Item 2</items>
            <values>value 2></values>
        </table>
        <table>
            <items>Item 3</items>
            <values>value 3></values>
        </table>
        <table>
            <items>Item 4</items>
            <values>value 4></values>
        </table>
        <table>
            <items>Item 5</items>
            <values>value 5></values>
        </table>
        <table>
            <items>Item 6</items>
            <values>value 6></values>
        </table>
        <table>
            <items>Item 7</items>
            <values>value 7></values>
        </table>
        <table>
            <items>Item 8</items>
            <values>value 8></values>
        </table>
    </root>

Теперь я хочу добавить новый узел в мой XML, в котором хранятся все значения, разделенные символом "/" через каждые 2 значения. Новый узел будет выглядеть так:

<combined>Item 1, value 1 / Item 2, value 2 / Item 3, value 3 / Item 4, value 4 / Item 5, value 5/ Item 6, value 6 / Item 7, value 7 / Item 8, value 8</combined>

Мне удалось сделать это только с узлом элементов, но как я могу получить приведенный выше результат? Пока это мой сценарий:

string text = File.ReadAllText(instance.Folder.InputFile.FullName);

XDocument doc = XDocument.Parse(text);
XElement root = doc.Root;
XElement Table= root.Element("Table");
Table.Add(new XElement("combined"));
XElement combined = Table.Element("combined");

string[] data = doc.Descendants("items").Select(x => (string)x).ToArray();

string splitData = string.Join(" / ", data.Select((x, i) => new { data = x, index = i }).GroupBy(x => x.index / 2).Select(x => string.Join(" , ", x.Select(y => y.data))));

combined.Add(splitData);

doc.Save(instance.Folder.InputFile.FullName);

Кто может мне помочь?

1 Ответ

3 голосов
/ 14 октября 2019

Вместо того, чтобы находить все элементы items, я бы сначала искал родительские элементы table, а затем рассмотрел это с точки зрения конвейера запросов:

  • Найти все table элементы
  • В каждом элементе найдите элементы items и values и захватите их значения в виде строк
  • Преобразование каждой пары строк в пару через запятую
  • Использованиеstring.Join чтобы собрать их вместе

Например:

var doc = XDocument.Load("test.xml");
var commaSeparated = doc
    .Descendants("table")
    .Select(x => new { Items = x.Element("items").Value, Values = x.Element("values").Value })
    .Select(pair => $"{pair.Items}, {pair.Values}");
var result = string.Join(" / ", commaSeparated);

С указанным вами XML-кодом результат будет:

Item 1, value 1> / Item 2, value 2> / Item 3, value 3> / Item 4, value 4> / Item 5, value 5> / Item 6, value 6> / Item 7, value 7> / Item 8, value 8>

Обратите внимание, что в вопросе XML содержатся дополнительные > символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...