2017-09-02 5 views
0

Ich habe XML, das ich zum Objekt deserialisieren möchte. Es gibt keine Fragen, wenn ich nur Nicht-Multiple-Wert-Element deserialize, aber ich habe keine Ahnung, was mit einem Array von Wertelementen in Wertelement zu tun. Es gibt immer UnknownNode mit Local = #text,Wie wird das Element deserialisiert, das ein einzelnes Array oder ein Array sein kann?

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> 

Klasse i mit 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; } 
    } 
} 

Deserialisieren Code

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

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

i erhalten deserialisieren kann Daten erhalten mit:

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

aber gibt es einen Weg, um es mit nur Deserialisierung weicher zu machen?

Antwort

0

Haben Sie versucht, XmlArrayAttribute zu verwenden?

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

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

Überprüfen Sie diese question.

+0

Nein, das funktioniert nicht. Hauptsache, ich kann nicht verstehen - "Wert" -Klasse wird rekursiv verwendet, aber wo Text gespeichert wird, gibt es kein String-Feld dafür. – SLion

Verwandte Themen