2016-04-06 11 views
3

Ich bin derzeit versucht, ein XML mit dem [Serializable()] - Befehlsobjekt zu deserialisieren und ich habe ein Problem. Hier ist der Code Beispiel:Füllen Sie ein Array aus XML-Datei mit Serializable()

using System; 
using System.Xml.Linq; 
using System.Xml.Serialization; 
using System.IO; 

namespace XmlManipulation 
{ 
    public class XmlManip 
    { 
     public static TestCasesList SerializeTest() //test function 
     { 
      TestCasesList testslist = null; 
      string path = @"C:\Users\sxtx2987\Documents\Visual Studio 2015\Projects\FDB\deleteme\test.xml"; 

      XmlSerializer serializer = new XmlSerializer(typeof(TestCasesList)); 

      StreamReader reader = new StreamReader(path); 

     testslist = (TestCasesList)serializer.Deserialize(reader); 
     reader.Close(); 
     return testslist; 
     } 
    } 


    [Serializable()] 
    public class TestCase 
    { 
     [System.Xml.Serialization.XmlElement("name")] 
     public string name; 

     [System.Xml.Serialization.XmlElement("objective")] 
     public string objective; 

     [System.Xml.Serialization.XmlElement("criteria")] 
     public string criteria; 

     [System.Xml.Serialization.XmlElement("issue")] 
     public string issue; 

     [System.Xml.Serialization.XmlElement("clientcomments")] 
     public string clientcomments; 

     [System.Xml.Serialization.XmlElement("authoritycomments")] 
     public string authoritycomments; 
    } 

    [Serializable()] 
    [XmlType("testcaseslist")] 
    public class TestCasesList 
    { 
     [XmlArray("testcase")] 
     public TestCase[] TestCase { get; set; } 
    } 
} 

Und hier ist die Datei, die ich

<xml version="1.00" encoding="UTF-8"> 
    <campaign> 
     <name>Test XML</name> 
     <number>XXXXXG04-06-1</number> 
     <client>Fictional</client> 
     <model>Rocket powered boots</model> 
     <authority>Fictional authority</authority> 
    </campaign> 

    <testcaseslist> 
     <testcase> 
      <name>TestCase001</name> 
      <objective>Objective test 1</objective> 
      <criteria>Pass criteria test 1</criteria> 
      <issue>Issue Description test 1</issue> 
      <clientcomments>Client comments test 1</clientcomments> 
      <authoritycomments>Authority comments test 1</authoritycomments> 
     </testcase> 

     <testcase> 
      <name>TestCase002</name> 
      <objective>Objective test 2</objective> 
      <criteria>Pass criteria test 2</criteria> 
      <issue>Issue Description test 2</issue> 
      <clientcomments>Client comments test 2</clientcomments> 
      <authoritycomments>Authority comments test 2</authoritycomments> 
     </testcase> 
    </testcaseslist>  
</xml> 

deserialisieren versuche Was ich versuche, alle Wurzeln Element „Testfall“ zu erreichen, nimmt und jedes Kind Element setzen (namentlich: Name, Ziel, Kriterien, Issue, clientcomments, authoritycomments) in einer Klasse TestCasesList aus mehreren Klassen TestCase.

So in diesem Beispiel:

TestCasesList

| -> Testfall 1

| -> Testfall 2

| -> etc ....

, die enthält alle Elemente des Testfalls.

Der Code, den ich oben habe, ist, was ich bis jetzt sammeln konnte, aber da dies eine ganz bestimmte Aktion ist, die ich versuche zu tun, finde ich nicht alle relevanten Informationen, um mein Problem zu lösen.

Der Code werfen keine Fehler, aber wenn ich versuche, das Funktionsobjekt

 TestCasesList test = null; 

     test = XmlManipulation.XmlManip.SerializeTest(); 

ich einen leeren Test aufrufen.

Ich denke, dass mein Problem ist die XmlType und XmlArray Abschnitt, aber nach ein paar Stunden der Forschung und Studien, kann ich immer noch nicht die Informationen aus dem XML.

Vielen Dank für Ihre Zeit.

Antwort

1

Sie haben hier ein paar Probleme.

  1. Das Wurzelelement kann nicht sein, was Sie denken, es ist. Ihr Code geht davon aus, dass das Stammelement ist. Aber in Wirklichkeit ist die folgende das Wurzelelement:

    <xml version="1.00" encoding="UTF-8"> 
        <!-- XML Contents --> 
    </xml> 
    

    Das Wurzel sieht aus wie eine Standard-XML-Deklaration:

    <?xml version="1.0" encoding="UTF-8"> 
    

    aber es fehlt das Fragezeichen <?xml> am Anfang. Sie müssen also Ihren Code ändern, um damit umzugehen. Sie können dies tun, indem Sie mit einem oder dem Deserialisieren eines geeigneten Containertyps zum entsprechenden Element springen.

  2. Innerhalb <testcaseslist> sind die Elemente <testcase> nicht unter einem Container-Element gruppiert. Daher müssen Sie [XmlElement("testcase")] nicht [XmlArray("testcase")] verwenden.

  3. Um einen Stammelementnamen für eine Klasse zu deklarieren, müssen Sie [XmlRoot("testcaseslist")] nicht [XmlType("testcaseslist")] verwenden.

So kann Ihr TestCasesList sollte wie folgt aussehen:

[XmlRoot("testcaseslist")] 
public class TestCasesList 
{ 
    [XmlElement("testcase")] 
    public TestCase[] TestCase { get; set; } 
} 

Dann in Ihrem XML überspringen vorwärts und deserialisieren das <testcaseslist> Element verwenden XmlReader.ReadToFollowing():

public static TestCasesList Deserialize(TextReader reader) 
    { 
     using (var xmlReader = XmlReader.Create(reader)) 
     { 
      // Skip to the <testcaseslist> element. 
      if (!xmlReader.ReadToFollowing("testcaseslist", "")) 
       return null; 

      var serializer = new XmlSerializer(typeof(TestCasesList)); 
      return (TestCasesList)serializer.Deserialize(xmlReader); 
     } 
    } 

Wo reader Ihre StreamReader reader = new StreamReader(path); ist .

Alternativ den Containertyp mit:

[XmlRoot("xml")] 
public class XmlRoot 
{ 
    public TestCasesList testcaseslist { get; set; } 
} 

Sie tun können:

public static TestCasesList Deserialize(TextReader reader) 
    { 
     var serializer = new XmlSerializer(typeof(XmlRoot)); 
     var root = (XmlRoot)serializer.Deserialize(reader); 
     return root == null ? null : root.testcaseslist; 
    } 

Einige der Schwierigkeiten, oben durch die automatische Generierung Ihrer C# -Klassen aus Ihrem XML hätte vermieden werden können, z.B. mit http://xmltocsharp.azurewebsites.net/. Für mehr siehe Generate C# class from XML.

Im Übrigen hat [Serializable] keinen Einfluss auf XmlSerializer.

+0

Vielen Dank für Ihre ausführlichen Erklärungen. Nachdem ich mit dem XML-Code herumgespielt hatte, bemerkte ich, dass ich, wenn ich diese Art von Struktur für die Serialisierung verwendete, einfach die Variablennamen verwenden konnte und eine Struktur ohne die [serializable] -Tags verwendete und einfach die public-Variable für die Serialisierung verwendete. Ihre Erklärungen beleuchten jedoch den Mechanismus von XML für mich. Vielen Dank. –

Verwandte Themen