【问题标题】:Load Multiple XML Elements into Object using Serialization in C#使用 C# 中的序列化将多个 XML 元素加载到对象中
【发布时间】:2009-09-04 23:19:23
【问题描述】:

我正在尝试使用 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>

【问题讨论】:

  • 仅供参考,file 永远不会为空。

标签: c# xml serialization


【解决方案1】:

尝试将[XmlElement] 放在Element3 上。

【讨论】:

  • @John:哇,好简单 :)。我不知道仅使用此属性是可能的。
  • 阅读有关属性的文档非常值得,甚至可以为自己创建一些小示例以了解它们是如何工作的。迟早你会需要它们。
【解决方案2】:

您的数组未加载的原因是,就 .NET XML 序列化而言,您没有尝试读取数组。数组可以表示为:

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

您需要更改源 XML 的格式或为您的类创建自定义 XML 序列化器来处理您的情况。

【讨论】:

    【解决方案3】:

    我认为你的 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();
        }
    }
    

    【讨论】:

    • @Kelix:如果您无法收到为您的班级正确格式化的 xml,您将需要按照 Justin 的建议创建一个自定义 Xml 序列化器。
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2016-09-15
    相关资源
    最近更新 更多