2016-11-02 5 views
-1

Ich versuche herauszufinden, wie ich Teile einer XML-Datei in eine Klasse einlesen kann. Teile von XML zu verschiedenen Klassen analysieren

Dies ist die Struktur der XML-Datei:

<Root> 
    <Element1> 
    <Element2> 
     <ElementID></ElementId> 
     <Element3a> 
     <Element3aId id="">0</Element3aId> 
     <Element3aId id="">0</Element3aId> 
     </Element3a> 
     <Element3b> 
     <Element3bId id="">0</Element3bId> 
     <Element3bId id="">0</Element3bId> 
     </Element3b> 
     <Element3c> 
     <Element3cId id="">0</Element3cId> 
     <Element3cId id="">0</Element3cId> 
     </Element3c> 
    </Element2> 
    </Element1> 
</Root> 

ich die folgenden Klassen erstellt haben (I entfernt Accessoren/Mutatoren, um zu versuchen, den Code zu vereinfachen:

public struct Element3a 
{ 
    [XmlAttribute("id")] 
    string id; 

    [XmlElement("Element3aId")] 
    int Element3aId; 
} 

[XmlRootAttribute("Element2")] 
public struct Element1 
{ 
    [XmlElement("ElementID")] 
    int id; 

    List<Element3a> Element3aId; 

    List<Element3a> Element3bId; 

    List<Element3a> Element3cId; 
} 

Hier ist mein Parsing code:

XDocument xDoc = XDocument.Load(filePath); 

var Element2List = xDoc.Root.Descendants().FirstOrDefault(c => c.Name.LocalName.Equals("Element1")); 
XmlSerializer serializer = new XmlSerializer(typeof(Element1)); 

using (var reader = Element2List.CreateReader()) 
{ 
    do 
    { 
     reader.ReadToDescendant("Element2"); 
     Element1 tag1 = (Element1)serializer.Deserialize(reader.ReadSubtree()); 

     // How do I populate the Element3a Lists here? 

    } while (reader.ReadToNextSibling("Station")); 
    reader.Close(); 
} 

Element3a/3b/3c alle haben die gleichen Daten in ihnen, also möchte ich in der Lage sein um sie nur in die Element3a-Strukturen zu serialisieren. Ich bin in der Lage, die Element2-Informationen in die Element2-Klasse zu bekommen, aber ich kann die Element3a-Listen in dieser Klasse nicht auffüllen.

Vielen Dank für die Hilfe! Ich entschuldige mich für die Tag-Namen, ich versuchte zu vereinfachen, so viel wie ich konnte.

+0

Hinweis: eine gültige HTML-Posting uns helfen kann ... –

+0

Wie kann ich das tun? Meinst du ein HTML-Code-Snippet? – user2970916

+0

Ok, du hast dein XML korrigiert, aber eins verpasst. Xml ist case sensitive 'ElementID! = ElementId' –

Antwort

-1

Statt serialize Verwendung Xml Linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      Element1 elements = doc.Descendants("Element2").Select(x => new Element1() { 
       id = (string)x.Element("ElementID") == "" ? null : (int?)x.Element("ElementID"), 
       Element3aId = x.Descendants("Element3a").Select(y => new Element3a { 
        id = (string)y.Attribute("id"), 
        Element3aId = (string)y.Element("Element3aId") == "" ? null : (int?)y.Element("Element3aId") 
       }).ToList(), 
       Element3bId = x.Descendants("Element3b").Select(y => new Element3a { 
        id = (string)y.Attribute("id"), 
        Element3aId = (string)y.Element("Element3bId") == "" ? null : (int?)y.Element("Element3bId") 
       }).ToList(), 
       Element3cId = x.Descendants("Element3c").Select(y => new Element3a 
       { 
        id = (string)y.Attribute("id"), 
        Element3aId = (string)y.Element("Element3cId") == "" ? null : (int?)y.Element("Element3cId") 
       }).ToList() 
      }).FirstOrDefault(); 
     } 
    } 
    public struct Element3a 
    { 
     public string id; 
     public int? Element3aId; 
    } 

    public struct Element1 
    { 
     public int? id; 

     public List<Element3a> Element3aId; 

     public List<Element3a> Element3bId; 

     public List<Element3a> Element3cId; 
    } 
} 
+0

Damit bekomme ich nicht das Element3aId ... Ich bekomme dort immer null. – user2970916

+0

Ich habe es funktioniert ... brauchte nicht das Element .Element ("Element3aId"). – user2970916

+0

Haben Sie die XML-Datei geändert? Sollte ohne Änderung funktionieren. Ich habe den Code geändert. Der alte Code bekam immer ein statt a, b, c. – jdweng