Как получить элементы XML и значения атрибутов с одинаковыми именами для объекта класса? - PullRequest
0 голосов
/ 20 сентября 2019

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

<?xml version="1.0" encoding="UTF-8"?>
<GridResponse xmlns="http://partner.xxx.net/aapi/2009/08/">
    <Brand id="1234">ACME</Brand>
    <User>username</User>
    <Grids>
        <Grid type="mailing_folder">
            <Record row="1">
                <Fields>
                    <Field element="folder_id">0</Field>
                    <Field element="is_deleted">0</Field>
                    <Field element="name">Main Folder</Field>
                </Fields>
            </Record>
        </Grid>
    </Grids>
</GridResponse>

Мне нужно получить значения:

<Field element="folder_id">0</Field>
<Field element="is_deleted">0</Field>
<Field element="name">Main Folder</Field>

в следующий класс:

[Serializable()]
[XmlRoot("GridResponse", Namespace = "http://partner.xxx.net/aapi/2009/08/", IsNullable = false)]

public class MailingFolder
{
    [XmlAttribute(AttributeName = "element", Namespace = "http://partner.xxx.net/aapi/2009/08")]

    private int _folder_Id;
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public int Folder_id
    {
        get
        {
            return this._folder_Id;
        }
        set
        {
            this._folder_Id = value;
        }
    }

    [XmlAttribute(AttributeName = "element", Namespace = "http://partner.xxx.net/aapi/2009/08")]
    private bool _is_Deleted;
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool Is_Deleted
    {
        get
        {
            return this._is_Deleted;
        }
        set
        {
            this._is_Deleted = value;
        }
    }

    [XmlAttribute(AttributeName = "element", Namespace = "http://partner.xxx.net/aapi/2009/08")]
    private string _name;
    /// <remarks/>
    //[System.Xml.Serialization.XmlAttributeAttribute()]
    [System.Xml.Serialization.XmlText()]
    public string Name
    {
        get
        {
            return this._name;
        }
        set
        {
            this._name = value;
        }
    }
}

Iне удалось различить уникальные значения, потому что элемент Field и атрибут Element имеют одинаковые имена.

Может кто-нибудь помочь мне с тем, как десериализовать это в класс?

Ответы [ 2 ]

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

Мне нравится использовать словари:

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);
            XNamespace ns = doc.Root.GetDefaultNamespace();

            Dictionary<string,string> dict = doc.Descendants(ns + "Field")
                .GroupBy(x => (string)x.Attribute("element"), y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            MailingFolder folder = new MailingFolder()
            {
                Folder_id = int.Parse(dict["folder_id"]),
                Is_Deleted = dict["is_deleted"] == "0" ? false : true,
                Name = dict["name"]
            };
         }
    }
    public class MailingFolder
    {
        public int Folder_id { get; set; }
        public bool Is_Deleted { get; set; }
        public string Name { get; set; }
    }
}
0 голосов
/ 20 сентября 2019

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

var xml = XDocument.Load(@"C:\GridResponse.xml");

var query = from c in xml.Root.Descendants("GridResponse")
            select c.Element("folder_id").Value + " " +
                   c.Element("is_deleted").Value+ " " +
                   c.Element("name").Value;

foreach (string name in query)
{
   //Do something 
}
...