Десериализовать XML в список <> - PullRequest
0 голосов
/ 02 октября 2018

Возможно ли преобразовать следующий XML в список?

<?xml version="1.0" encoding="UTF-8"?>
<DATA>
    <SIGNATURES>
        <SIGNATURE>
            <UTILISATEUR>John Doe</UTILISATEUR>
            <ACTEUR>Emetteur</ACTEUR>
            <DATE>20160429</DATE>
        </SIGNATURE>
        <SIGNATURE>
            <UTILISATEUR>Philippe Martin</UTILISATEUR>
            <ACTEUR>Responsable Qualité Projet</ACTEUR>
            <DATE>20160503</DATE>
        </SIGNATURE>
    </SIGNATURES>
</DATA>

Я ищу следующий результат:

enter image description here

Но XML является примером, я не знаю структуру заранее, поэтому я не могу создать класс, который будет иметь ту же структуру ... Я ищу общее решение.

Спасибо.

edit:

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

<DATA>
    <ELEMENTS Cle="NAME_1">
        <ELEMENT>
          <ELEMENT Cle="TAG_1" Valeur="John Doe"></ELEMENT>
          <ELEMENT Cle="TAG_2" Valeur="6 rue du Marché"></ELEMENT>
          <ELEMENT Cle="TAG_3" Valeur="Responsable marketing"></ELEMENT>
          <ELEMENT Cle="TAG_N" Valeur="..."></ELEMENT>
        </ELEMENT>
        <ELEMENT>...</ELEMENT>
    </ELEMENTS>
    <ELEMENTS Cle="NAME_N">...</ELEMENTS>
</DATA>

он «уважает» формат, но содержание никогда не бывает прежним.И я извлекаю данные в некоторый словарь:

public class Element
{
    public string Valeur { get; set; }
    public Dictionary<string, Dictionary<string, List<Element>>>    taElements  { get; set; }

    public Element()
    {
        taElements  = new Dictionary<string, Dictionary<string, List<Element>>>();
    }

    public void SetXML(string xml)
    {
        var document = XDocument.Parse(xml);
        var root = document.Root;

        foreach (var elements in root.Elements("ELEMENTS"))
        {
            var _taElement = new Dictionary<string, List<Element>>();

            foreach (var element in elements.Descendants("ELEMENT"))
            {
                if (element.Attribute("Cle") == null) { continue; }

                if (!_taElement.ContainsKey(element.Attribute("Cle").Value)) { _taElement.Add(element.Attribute("Cle").Value, new List<Element>()); }

                var elem = new Element();

                if (element.Attribute("Valeur") != null) { elem.Valeur = element.Attribute("Valeur").Value; }

                _taElement[element.Attribute("Cle").Value].Add(elem);

                if (!taElements.ContainsKey(elements.Attribute("Cle").Value)) { taElements.Add(elements.Attribute("Cle").Value, new Dictionary<string, List<Element>>()); }

                taElements[elements.Attribute("Cle").Value] = _taElement;
            }
        }
    }
}

Но невозможно сделать привязку словаря в ItemsControl (что является моей конечной целью).

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете создать List<Dictionary<string,string>>, который будет обрабатывать большинство любых XML, используя LINQ to XML.Вы можете извлечь имя элемента.

var xd = XDocument.Parse(doc);
var elementName = xd.FirstChild().Name.ToString().TrimEnd('S');
var ans = xd.Descendants(elementName).Select(d => d.Descendants().ToDictionary(dd => dd.Name.ToString(), dd => dd.Value)).ToList();

Если вам нужно связать ans с DataGridView, то вы можете использовать DataTable.

ИспользуяМетод расширения, вы можете преобразовать List<Dictionary> в DataTable:

public static DataTable ToDataTable(this IEnumerable<IDictionary<string, string>> rows) {
    var dt = new DataTable();
    if (rows.Any()) {
        foreach (var kv in rows.First())
            dt.Columns.Add(kv.Key, typeof(String));

        foreach (var r in rows)
            dt.Rows.Add(r.Values.ToArray());
    }
    return dt;
}

Теперь вы можете создать DataTable для DataSource:

var dt = ans.ToDataTable();
0 голосов
/ 02 октября 2018

Посмотрите документацию XMLSerializer / Deserialize .Он будет сериализовать класс в XML или прочитать поток XML в класс. Сериализация XML

    static void Main(string[] args)
    {
        DATA data = new DATA();
        data.SIGNATURES = new List<SIGNATURE>();
        data.SIGNATURES.Add(new SIGNATURE() { ACTEUR = "", DATE= "", UTILISATEUR= "" });
        data.SIGNATURES.Add(new SIGNATURE() { ACTEUR = "", DATE = "", UTILISATEUR = "" });

        XmlSerializer serializer = new XmlSerializer(typeof(DATA));
        using (TextWriter writer = new StreamWriter(@"Xml.xml"))
        {
            serializer.Serialize(writer, data);
        }

        XmlSerializer deserializer = new XmlSerializer(typeof(DATA));
        TextReader reader = new StreamReader(@"myXml.xml");
        object obj = deserializer.Deserialize(reader);
        DATA XmlData = (DATA)obj;
        reader.Close();
    }


  public class SIGNATURE
    {
        public string UTILISATEUR { get; set; }
        public string ACTEUR { get; set; }
        public string DATE { get; set; }
    }

    public class DATA
    {
        public List<SIGNATURE> SIGNATURES { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...