2017-09-02 37 views
0

得到了我想要反序列化为对象的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> 

I类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; 
       } 
      } 
     }; 

但有没有办法让它更平滑的方式使用只是反序列化?

回答

0

您是否尝试过使用XmlArrayAttribute?

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

[XmlType("Value")] 
public class Value 
{ 
    .... 
} 

看看这个question

+0

不,这不起作用。主要的东西我不明白 - “值”类是递归使用,但文本存储在哪里,没有字符串字段。 – SLion

相关问题