首页 > 解决方案 > XmlSerializer 访问父元素中的子逻辑元素

问题描述

我正在使用标准 .NETXmlSerializer反序列化以下 xml:

<root>
    <Element>
        <Grouping1>
            <Item1>First</Item1>
            <Item2>Second</Item2>
        </Grouping1>
        <Grouping2>
            <Item3>Third</Item3>
        </Grouping2>
    </Element>
</root>

我想将其序列化为以下类:

class Element
{
    [XmlElement("Item1")]
    public string Item1 { get; set; }

    [XmlElement("Item2")]
    public string Item2 { get; set; }

    [XmlElement("Item3")]
    public string Item3 { get; set; }
}

这当然不起作用,因为 - 例如 -<Item1>不在逻辑容器中,<Element>而是在逻辑容器中<Grouping1>

问题:

有没有办法告诉在元素XmlSerializer中寻找?有些东西打断了Item1<Grouping1>
[XmlElement("Grouping1.Item1")]


PS:我不想创建一个Grouping1类(如此处所建议),因为分组只是逻辑容器,不应该有自己的类。

标签: c#xmlserializationxml-serialization

解决方案


使用 XML Linq。自定义序列化程序会复杂得多

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

namespace ConsoleApplication4
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Element> elements = doc.Descendants("Element").Select(x => new Element()
            {
                Item1 = (string)x.Descendants("Item1").FirstOrDefault(),
                Item2 = (string)x.Descendants("Item2").FirstOrDefault(),
                Item3 = (string)x.Descendants("Item3").FirstOrDefault()
            }).ToList();

         }
    }
    class Element
    {
        public string Item1 { get; set; }
        public string Item2 { get; set; }
        public string Item3 { get; set; }
    }


}

这是序列化程序的样子

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

namespace ConsoleApplication4
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Root));
            Root root = (Root)serializer.Deserialize(reader);


         }
    }
    [XmlRoot("root")]
    public class Root
    {
        [XmlElement("Element")]
        public List<Element> Element { get; set; }
    }

    public class Element : IXmlSerializable
    {
        private string Item1 { get; set; }
        private string Item2 { get; set; }
        private string Item3 { get; set; }

        public void WriteXml(XmlWriter writer)
        {
            XElement element = new XElement("Element", new object[] {
                new XElement("Grouping1", new object[] {
                    new XElement("Item1", Item1),
                    new XElement("Item2", Item2)
                }),
                new XElement("Grouping2", new XElement("Item3", Item3))
            });
            element.WriteTo(writer);

        }

        public void ReadXml(XmlReader reader)
        {
            XElement element = (XElement)XElement.ReadFrom(reader);

            Item1 = (string)element.Descendants("Item1").FirstOrDefault();
            Item2 = (string)element.Descendants("Item2").FirstOrDefault();
            Item3 = (string)element.Descendants("Item3").FirstOrDefault();

        }

        public XmlSchema GetSchema()
        {
            return (null);
        }
    }


}

推荐阅读