2012-10-16 6 views
22

ich ein XML-Dokument ähnlich den folgenden habe:Mit XmlSerializer mit einem Array in dem Wurzelelement

<scan_details> 
    <object name="C:\Users\MyUser\Documents\Target1.doc"> 
     ... 
    </object> 
    <object name="C:\Users\MyUser\Documents\Target2.doc"> 
     ... 
    </object> 
    ... 
</scan_details> 

ich die System.Xml.Serialization Attribute zu verwenden ist die Hoffnung, XML-Deserialisierung zu vereinfachen. Das Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie angegeben wird, dass der Wurzelknoten ein Array enthält.

Ich habe versucht, die Schaffung der folgenden Klassen:

[XmlRoot("scan_details")] 
public class ScanDetails 
{ 
    [XmlArray("object")] 
    public ScanDetail[] Items { get; set; } 
} 

public class ScanDetail 
{ 
    [XmlAttribute("name")] 
    public string Filename { get; set; } 
} 

Allerdings, wenn ich die XML in das ScanDetails Objekt deserialisieren das Items Array bleibt null.

Wie deserialize ich ein Array in einem Stammknoten?

Antwort

41

Sie sollten [XmlElement] und nicht [XmlArray] verwenden, um die Items-Eigenschaft zu dekorieren - es ist bereits ein Array, und Sie möchten nur den Elementnamen festlegen.

public class StackOverflow_12924221 
{ 
    [XmlRoot("scan_details")] 
    public class ScanDetails 
    { 
     [XmlElement("object")] 
     public ScanDetail[] Items { get; set; } 
    } 

    public class ScanDetail 
    { 
     [XmlAttribute("name")] 
     public string Filename { get; set; } 
    } 

    const string XML = @"<scan_details> 
          <object name=""C:\Users\MyUser\Documents\Target1.doc""> 
          </object> 
          <object name=""C:\Users\MyUser\Documents\Target2.doc""> 
          </object> 
         </scan_details> "; 

    public static void Test() 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(ScanDetails)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     var obj = xs.Deserialize(ms) as ScanDetails; 
     foreach (var sd in obj.Items) 
     { 
      Console.WriteLine(sd.Filename); 
     } 
    } 
} 
+0

Ah ... Das ist verwirrend terminoligy sie verwenden. Ich hatte mich auf 'XmlArray' und' XmlArrayItem' konzentriert. Dank dafür! –

+1

Wenn ein Array, aber nicht nur unter der Stammebene, dann scheint die Array-Eigenschaft immer noch [XmlArray ("arrayElementName")] und nicht [XmlElement ("arrayElementItemName")], aber unter der Stammebene wie Ihre Antwort es benötigt [XmlElement ("arrayElementItemName")] Weißt du, warum das so ist? Es ist wie auf der Stammebene beschreiben Sie die inneren sich wiederholenden Elementtypen und anderswo den Array-Typ. – CRice

+0

Ich möchte nur einen Moment nehmen, um Ihnen zu danken. Ich habe viele Antworten auf viele Fragen durchforstet und das ist das Einzige, was funktioniert. Es ist so unintuitiv, dass Sie das Array-Attribut weder für das Stammelement noch für das Array-Element definieren müssen. – Gaugeforever

Verwandte Themen