Как объединить значения повторяющихся узлов в один узел? - PullRequest
1 голос
/ 20 сентября 2019

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

<root>
    <table>
        <items>Item 1</items>
    </table>
    <table>
        <items>Item 2</items>
    </table>
    <table>
        <items>Item 3</items>
    </table>
    <table>
        <items>Item 4</items>
    </table>
</root>

Я хочу объединить все значения элементов в один узел, чтобы использовать это значение узла в некотором фрагменте кода.

Конечный результат должен выглядеть следующим образом:

<root>
    <table>
        <items>Item 1, Item 2, Item 3, Item 4</items>
    </table>
</root>

Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2019

Спасибо за помощь, перепробовал несколько решений.

Я получил следующее решение:

    var input = "XML";

    XDocument doc = XDocument.Parse(input);

    XElement root = doc.Root;
    XElement parentTable = root.Element("parentTable");
    parentTable.Add(new XElement("components"));
    XElement components = parentTable.Element("components");
    ArrayList componentArray = new ArrayList();

    foreach (var d in doc.Descendants("table"))

    {
        componentArray.Add(d.Value + ", ");
    }

    components.Add(componentArray);

    doc.Save("XML");
0 голосов
/ 21 сентября 2019

Использование Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement root = doc.Root;

            List<XElement> children = root.Elements().ToList();
            string[] items = root.Descendants("items").Select(x => (string)x).ToArray();

            for (int i = 0; i < children.Count; i++)
            {
                if (i == 0)
                {
                    children[i].Element("items").ReplaceWith(new XElement("items", string.Join(",", items)));
                }
                else
                {
                    children[i].Remove();
                }
            }
        }
    }
}
0 голосов
/ 20 сентября 2019

Попробуйте:

     var newXml = new XDocument(
                    new XElement("root",
                       new XElement("table",
                          new XElement("items", 
        XDocument.Parse(xml)
           .Descendants()
           .SelectMany(x => x.Elements("table"))
           .Select(x => x.Element("items").Value)
           .Aggregate((x, y) => string.Join(", ", x, y))))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...