【问题标题】:How to deserialize element that can be single or array?如何反序列化可以是单个或数组的元素?
【发布时间】:2017-09-02 12:06:32
【问题描述】:

得到了我想反序列化为对象的 XML。 如果我只反序列化非多值元素,没有问题,但我不知道如何处理值元素中的值元素数组。 总有 UnknownNode 与 LocalName = #text,

要反序列化的 XML

   <?xml version="1.0" encoding="UTF-8"?>
    <issue>
        <custom_fields type="array">
            <custom_field id="11" name="Version">
                <value>7.9.18.31</value>
            </custom_field>
            <custom_field id="89" name="Tags" multiple="true">
                <value type="array">
                    <value>Tag1</value>
                    <value>Tag3</value>
                    <value>Tag6</value>
                </value>
            </custom_field>
            <custom_field id="90" name="started_on">
                <value>2017-08-25</value>
            </custom_field>
        </custom_fields>
    </issue>

我通过 xsd.exe 获得的课程

using System.Xml.Serialization;

[XmlRoot(IsNullable=false)]
public partial class issue
{  
    private object[] itemsField;

    [XmlElement("custom_fields", typeof(issueCustom_fields))]
    [XmlElement("value", typeof(Value))]
    public object[] Items
    {
        get { return itemsField; }
        set { itemsField = value; }
    }
}

public class Value
{
    private Value[] valueField;
    private string typeField;

    [XmlElement("value")]
    public Value[] value
    {
        get { return valueField; }
        set { valueField = value; }
    }

    [XmlAttribute]
    public string type
    {
        get { return typeField; }
        set { typeField = value; }
    }
}

public class issueCustom_fields
{
    private issueCustom_fieldsCustom_field[] custom_fieldField;    
    private string typeField;

    [XmlElement("custom_field")]
    public issueCustom_fieldsCustom_field[] custom_field
    {
        get { return custom_fieldField; }
        set { custom_fieldField = value; }
    }

    [XmlAttribute]
    public string type
    {
        get { return typeField; }
        set { typeField = value; }
    }
}

public class issueCustom_fieldsCustom_field
{   
    private Value[] valueField;    
    private string idField;   
    private string nameField;    
    private string multipleField;

    [XmlElement("value")]
    public Value[] value
    {
        get { return valueField; }
        set { valueField = value; }
    }

    [XmlAttribute]
    public string id
    {
        get { return idField; }
        set { idField = value; }
    }

    [XmlAttribute]
    public string name
    {
        get { return nameField; }
        set { nameField = value; }
    }

    [XmlAttribute]
    public string multiple
    {
        get { return multipleField; }
        set { multipleField = value; }
    }
}

反序列化代码

    var ser = new XmlSerializer(typeof(issue));
    var issue = new issue();

    using (var sr = new StreamReader("testIssues.xml"))
        issue = (issue)ser.Deserialize(sr);

我可以使用以下方式获取数据:

ser.UnknownNode += (s, ea) =>
        {
            if (ea.LocalName == "#text" && ea.ObjectBeingDeserialized is Value)
            {
                Value val = (Value)ea.ObjectBeingDeserialized;

                if (val.value == null)
                {
                    val.Val = ea.Text;
                }
            }
        };

但是有没有办法只使用反序列化使其更平滑?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    您尝试过使用 XmlArrayAttribute 吗?

     [XmlArray("value")]
     public Value[] Items
     {
         get { return itemsField; }
         set { itemsField = value; }
     }
    
     [XmlType("Value")]
     public class Value
     {
        ....
     }
    

    看看这个question

    【讨论】:

    • 不,这不起作用。我无法理解的主要内容-递归使用“值”类,但是文本将存储在哪里,没有字符串字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多