繁体   English   中英

使用C#中的序列化将多个XML元素加载到对象中

[英]Load Multiple XML Elements into Object using Serialization in C#

我正在尝试使用C#中的反序列化将多个具有相同名称的元素从XML加载到类中。 我的示例中的所有内容都可以正常加载,但不会填充数组元素(Element3)。

码:

class Program
{
    static void Main(string[] args)
    {
        FileStream file = new FileStream("service.xml", FileMode.Open);

        if (file != null)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Service));
            Service service = (Service)serializer.Deserialize(file);
        }
    }
}

public class Service
{
    public bool Element1;
    public string Element2;
    public string[] Element3;
}

XML:

<Service>
    <Element1>true</Element1>
    <Element2>Text 1</Element2>
    <Element3>Text 2</Element3>
    <Element3>Text 3</Element3>
</Service>

尝试在Element3上放置[XmlElement]

您的阵列未加载的原因是,就.NET XML序列化而言,您不是在尝试读取数组。 数组将表示如下:

<Element3Array>
    <ArrayElement>Text 2</ArrayElement>
    <ArrayElement>Text 3</ArrayElement>
</Element3Array>

您需要更改源XML的格式或为您的类创建自定义XML Serializer以处理您的情况。

我认为你的xml是错的。 从逻辑上讲,数组是这样序列化的:

<Element3>
    <string>Text 2</string>
    <string>Text 3</string>
</Element3>

因此,您的xml必须具有以下格式:

<Service>
    <Element1>true</Element1>
    <Element2>Text 1</Element2>
    <Element3>
        <string>Text 2</string>
        <string>Text 3</string>
    </Element3>
</Service>

编辑 :如果无法更改格式,请添加一个示例以反序列化此xml。 以下代码未经过测试。

您的类Service必须从IXmlSerializable派生:

public class Service : IXmlSerializable
{
    public System.Xml.Schema.XmlSchema  GetSchema()
    {
        return null;
    }

    public void  ReadXml(System.Xml.XmlReader reader)
    {
        List<string> element3 = new List<string>();

        while (reader.Read())
        {
        if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element)
        {
            Element1 = Convert.ToBoolean(reader.ReadString());
        }
        else if (reader.Name == "Element2" && reader.NodeType == XmlNodeType.Element)
        {
            Element2 = reader.ReadString();
        }
        if (reader.Name == "Element1" && reader.NodeType == XmlNodeType.Element)
        {
            element3.Add(reader.ReadString());
        }
        }

        Element3 = element3.ToArray();
    }

    public void  WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteStartElement ("Service"); 

        writer.WriteStartElement ("Element1"); 
        writer.WriteString(Element1.ToString());
        writer.WriteEndElement();

        writer.WriteStartElement ("Element2"); 
        writer.WriteString(Element2.ToString());
        writer.WriteEndElement();

        foreach (string ele in Element3)
        {
        writer.WriteStartElement ("Element3"); 
        writer.WriteString(ele);
        writer.WriteEndElement();
        }

        writer.WriteEndElement();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM