Как я могу перебрать xml и удалить дубликаты? C# - PullRequest
1 голос
/ 27 апреля 2020

Я создал программу для извлечения данных из базы данных и преобразования их в XML. Он возвращает список из 24 объектов, которые я создал:

<?xml version = "1.0" encoding = "utf-16"
<ArrayOfData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Data>
        <interval>01</interval>
        <num>12345</num>
        <id>ABC123 </id>
        <type>LETTER</type>
        <party>1</party>
        <amount>-10</amount>
    </Data>
    <Data>
        <interval>02</interval>
        <num>12345</num>
        <id>ABC123 </id>
        <type>LETTER</type>
        <party>1</party>
        <amount>-11</amount>
    </Data>
    <Data>
        <interval>03</interval>
        <num>12345</num>
        <id>ABC123 </id>
        <type>LETTER</type>
        <party>1</party>
        <amount>-12</amount>
    </Data>
    <Data>
        <interval>04</interval>
        <num>12345</num>
        <id>ABC123 </id>
        <type>LETTER</type>
        <party>1</party>
        <amount>-13</amount>
    </Data>

В основном, данные идут с интервалами увеличения от 1 до 24. Я ищу, чтобы найти дубликаты и просто объединить их в одного ребенка, а затем искать то, что отличается, и создавать для него другой элемент, но держите их все в одном ребенке. Как я могу написать XML, чтобы сделать это? Пример:

 <Data>
    <num>12345</num>
    <id>ABC123 </id>
    <type>LETTER</type>
    <party>1</party>
    <details>
        <interval>01</interval>
        <amount>-10</amount>
    </details>
    <details>
        <interval>02</interval>
        <amount>-11</amount>
    </details>
    <details>
        <interval>03</interval>
        <amount>-12</amount>
    </details>
    <details>
        <interval>04</interval>
        <amount>-13</amount>
    </details>
</Data>

Я хочу создать функцию, которая возвращает это XML. Параметры в моей текущей функции теперь только для того, чтобы получить данные, используя эти параметры. Вот как я генерирую XML сейчас:

     public IActionResult CreateXML(int num, int id)
            {
                string xml = "";
                var temp = (from x in Context.InternalData.AsNoTracking() where (x.num == num && x.id == id) select x).ToList();
                using (var stringwrite = new Utf8StringWriter())
                {
                    var serializer = new XmlSerializer(temp.GetType());
                    serializer.Serialize(stringwrite, temp);
                    xml = stringwrite.ToString();
StringReader reader = new StringReader(stringwriter.ToString());
                reader.ReadLine();  //skips the UTF-16 header

                XDocument doc = XDocument.Load(reader);
                XElement arrayOfData = doc.Root;
                List<XElement> newData = new List<XElement>();

                var parties = doc.Descendants("Data")
                    .GroupBy(x => (string)x.Element("id"))
                    .ToList();

                foreach (var party in parties)
                {
                    XElement template = party.First();

                    List<XElement> details = party.Select(x => new XElement("details", new object[] {
                        new XElement("interval", (string)x.Element("interval")),
                        new XElement("amount", (string)x.Element("amount"))
                    })).ToList();

                    template.Element("interval").Remove();
                    template.Element("amount").Remove();
                    template.Add(details);
                    newData.Add(template);
                }
                arrayOfData.ReplaceAll(newData);
                return Ok(arrayOfData);

            }

                }

Я новичок в этом и никогда раньше не работал с генерацией XML. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 28 апреля 2020

Попробуйте xml linq:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            StringWriter stringwriter = new StringWriter();
            stringwriter.Write(xml);

            StringReader reader = new StringReader(stringwriter.ToString());
            reader.ReadLine();  //skips the UTF-16 header

            XDocument doc = XDocument.Load(reader);
            XElement arrayOfData = doc.Root;
            List<XElement> newData = new List<XElement>();

            var parties = doc.Descendants("Data")
                .GroupBy(x => (string)x.Element("id"))
                .ToList();

            foreach (var party in parties)
            {
                XElement template = party.First();

                List<XElement> details = party.Select(x => new XElement("details", new object[] {
                    new XElement("interval", (string)x.Element("interval")),
                    new XElement("amount", (string)x.Element("amount"))
                })).ToList();

                template.Element("interval").Remove();
                template.Element("amount").Remove();
                template.Add(details);
                newData.Add(template);
            }
            arrayOfData.ReplaceAll(newData);

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