C # XML сериализует / десериализует строку массива для имен элементов массива - PullRequest
0 голосов
/ 03 июля 2018

У меня есть XML-структура, подобная следующей:

<Doc>
<Items>
<Foo A="1"/>
<Bar A="2"/>
</Items>
</Doc>

Я бы хотел десериализовать XML в следующую модель:

[XmlRoot("Doc")]
public class MyDoc
{
    [XmlArray("Items")]
    // How do I select the element names
    public List<Item> Items { get; set; }
}

public class Item
{
     // How do I select the element name
     public string Name { get; set; }
}

Я бы хотел, чтобы свойство Item.Name содержало имена элементов: 'Foo', 'Bar'. Возможно ли это с атрибутами XML?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Могу поспорить, что это невозможно сделать с помощью атрибутов Xml.

Мы должны будем сделать это вручную. Например, путем реализации интерфейса IXmlSerializable.

[XmlRoot("Doc")]
public class MyDoc : IXmlSerializable
{
    [XmlArray("Items")]
    public List<Item> Items { get; set; }

    public XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(XmlReader reader)
    {
        Items = new List<Item>();

        reader.ReadToFollowing("Items");

        using (var innerReader = reader.ReadSubtree())
        {
            innerReader.MoveToContent();

            while (innerReader.Read())
            {
                if (innerReader.IsStartElement())
                {
                    var item = new Item { Name = innerReader.Name };
                    Items.Add(item);
                }
            }
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        throw new NotImplementedException();
    }
}

public class Item
{
    public string Name { get; set; }
}
0 голосов
/ 03 июля 2018

В списке nodeNames вы получите все имена элементов

                string data = File.ReadAllText("D://readXML.txt");
                //From File i am reading XML
                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(data);
                XmlNodeList list = xdoc.SelectNodes("//Doc");
                List<string> nodeNames = new List<string>();

                foreach (System.Xml.XmlNode node in xdoc.SelectNodes("//Doc/Items"))
                {
                    foreach (System.Xml.XmlNode child in node.ChildNodes)
                    {
                        if (!nodeNames.Contains(child.Name)) nodeNames.Add(child.Name);
                    }
                }

Пример использования атрибутов Ссылка взята

XmlDocument doc = new XmlDocument();
doc.LoadXml("<reply success=\"true\">More nodes go here</reply>");

XmlElement root = doc.DocumentElement;

string s = root.Attributes["success"].Value;
...