Извлечение XML значений в многомерный массив c# - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть файл xml, как показано ниже, и мне нужно извлечь значения и поместить их в многомерный массив. Идея в том, что когда у меня есть более одного тега <string> на root элемент <Etiquette>, мне нужно повторять одни и те же другие значения с каждым другим значением тега <string>

   <?xml version="1.0" encoding="utf-8"?>
   <ArrayOfEtiquette xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Etiquette>
     <BgColor>#8075D1C5</BgColor>
     <BorderColor>#FF4E5B6F</BorderColor>
     <AssociatedAffaireId>
       <string>d4689f33-5600-47fe-883d-efcbf5e469c2</string>
       <string>1bae35dd-d501-4d87-bdd4-147fc0ba29d2</string>
     </AssociatedAffaireId>
     <Label>Ouverte</Label>
    </Etiquette>
    <Etiquette>
     <BgColor>#80949CA8</BgColor>
     <BorderColor>#FF155E70</BorderColor>
     <AssociatedAffaireId>
       <string>203cc4a8-8c24-4a2d-837c-29c7c1f73007</string>
     </AssociatedAffaireId>
     <Label>Fermée</Label>
    </Etiquette>
   </ArrayOfEtiquette>

Желаемый результат:

{"#8075D1C5","#FF4E5B6F","d4689f33-5600-47fe-883d-efcbf5e469c2","Ouverte"}
{"#8075D1C5","#FF4E5B6F","1bae35dd-d501-4d87-bdd4-147fc0ba29d2","Ouverte"}
{"#80949CA8","#FF155E70","203cc4a8-8c24-4a2d-837c-29c7c1f73007","Fermée"}

С уважением,

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

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

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

namespace ConsoleApplication157
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            var results = doc.Descendants("Etiquette")
                .SelectMany(x => x.Descendants("string")
                    .Select(y => new { BgColor = (string)x.Element("BgColor"), BorderColor = (string)x.Element("BorderColor"), UID = (string)y }))
                .ToList();
        }
    }
}

Если вы хотите использовать массив вместо анонимного типа, используйте:

new string[] { (string)x.Element("BgColor"), (string)x.Element("BorderColor"), (string)y }
0 голосов
/ 21 февраля 2020

Вы можете попробовать с XDocument

XDocument xdoc = XDocument.Load("XMLFile7.xml");
var mdAarray = xdoc.Descendants("Etiquette")
                   .SelectMany(etiquette => 
                               etiquette.Descendants("string")
                                        .Select(associatedaffaire => new string[] {
                                          etiquette.Element("BgColor").Value.ToString(),
                                          etiquette.Element("BorderColor").Value.ToString(),
                                          associatedaffaire.Value.ToString(),
                                          etiquette.Element("Label").Value.ToString() }))
                    .ToArray();

Console.WriteLine(JsonConvert.SerializeObject(mdAarray));

ВЫХОД

[
 ["#8075D1C5","#FF4E5B6F","d4689f33-5600-47fe-883d-efcbf5e469c2","Ouverte"],
 ["#8075D1C5","#FF4E5B6F","1bae35dd-d501-4d87-bdd4-147fc0ba29d2","Ouverte"],
 ["#80949CA8","#FF155E70","203cc4a8-8c24-4a2d-837c-29c7c1f73007","Fermée"]
]
0 голосов
/ 21 февраля 2020

вам нужно только повторить сначала на Etiquette, затем повторить снова на AssociatedAffaireId

Каждый раз, когда вы можете вставить внутрь массива или списка (я буду использовать список для простоты)

    XDocument xdoc = XDocument.Load("pathToXml.xml");
    // iterate all Etiquette elements
    foreach (var etiquette in xdoc.Root.Elements("Etiquette"))
    {
        // store common values
        string bgColor = etiquette.Element("BgColor").Value;
        string borderColor = etiquette.Element("BorderColor").Value;
        string label = etiquette.Element("Label").Value;
        // iterate all AssociatedAffaireId.string elements and add to list
        var associatedAffaireIdEl = etiquette.Element("AssociatedAffaireId");
        foreach (var associatedAffaireId in associatedAffaireIdEl.Elements("string"))
        {
            string aaid = associatedAffaireId.Value;
            listOfArray.Add(new string[]{bgColor, borderColor, aaid, label});
        }
    }

Надеюсь, это поможет.

Извините, я нашел несколько ошибок. Проверьте мою скрипку здесь .

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