2017-09-02 7 views
0

Objectを逆シリアル化したいXMLがあります。 私は非複数値の要素だけを逆シリアル化する場合は何も質問はありませんが、私は値要素の値要素の配列で何をすべきか分かりません。 UnknownNodeは私がすることができます 単一または配列にできる要素を逆シリアル化する方法はありますか?

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

Xsd.exeではデシリアライズコード

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

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

で取得

<?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> 

クラスをデシリアライズする

XMLは、たLocalName =の#textと常にありますデータを取得する:

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

いいえ、これは動作しません。私が理解できない主な事柄 - "value"クラスは再帰的に使用されますが、テキストはどこに格納されるのでしょうか?このための文字列フィールドはありません。 – SLion

関連する問題