2017-09-02 33 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

相關問題