2017-11-13 2 views
1

Dies ist meine XML-Datei.Wie das XML-Dokument mit inneren Tags und inneren Elementen deserialisieren?

<getMetadata> 
<Project Name="Doors_Demo"> 
    <Module FullPath="/Doors_Demo/Test_Module2"> 
    <Attributes> 
    <Attribute name="TableType" type="TableType" /> 
    <Attribute name="TableTopBorder" type="TableEdgeType" /> 
    </Attributes> 
    </Module> 
</Project> 
</getMetadata> 

ich die oben XML deserialisieren möchten

Unten ist mein Code:

[XmlRoot("getMetadata")] 
public class RootClass 
{ 
    public Project element_Project; 

    [XmlElement("Project")] 
    public Project Project 
    { 
     get { return element_Project; } 
     set { element_Project = value; } 
    } 
} 

public class Project 
{ 
    public string name; 

    [XmlAttribute("Name")] 
    public string Id 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

public static void Main(string[] args) 
{ 
    RootClass obj = new RootClass(); 

    XmlSerializer serializer = new XmlSerializer(typeof(RootClass)); 
    using (FileStream stream = new FileStream(@"E:\getMetadata(4).xml", FileMode.Open)) 
    { 
     RootClass myxml = (RootClass)serializer.Deserialize(stream); 

     Console.WriteLine(myxml.Project.name); 
    } 
} 

Ich möchte meine XML in eine Liste deserialisieren, ich bin nicht in der Lage, alle inneren Elemente zuzugreifen und Attribute innerhalb des Wurzelelements.

Ich möchte Details des Moduls Element und seine inneren Elemente und Tags in Liste, die zugegriffen werden kann.

+1

1 puke-emoji für ein Dokument mit Elementen namens 'Attribut' ... –

Antwort

2

Hier ist ein kleiner Trick, um Klassen automatisch aus Ihrem XML zu generieren.

Erstellen Sie zuerst eine neue leere Klasse, nennen Sie sie zum Beispiel TempXml.

Kopieren Sie Ihr XML in die Zwischenablage und öffnen Sie die neue leere Klasse, die Sie gerade erstellt haben.

Zum Visual Studio bearbeiten Menü dann einfügen und Einfügen von XML als Klassen:

Paste XML as Classes

Dies wird den folgenden Code generieren:

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class getMetadata 
{ 

    private getMetadataProject projectField; 

    /// <remarks/> 
    public getMetadataProject Project 
    { 
     get 
     { 
      return this.projectField; 
     } 
     set 
     { 
      this.projectField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class getMetadataProject 
{ 

    private getMetadataProjectModule moduleField; 

    private string nameField; 

    /// <remarks/> 
    public getMetadataProjectModule Module 
    { 
     get 
     { 
      return this.moduleField; 
     } 
     set 
     { 
      this.moduleField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class getMetadataProjectModule 
{ 

    private getMetadataProjectModuleAttribute[] attributesField; 

    private string fullPathField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlArrayItemAttribute("Attribute", IsNullable = false)] 
    public getMetadataProjectModuleAttribute[] Attributes 
    { 
     get 
     { 
      return this.attributesField; 
     } 
     set 
     { 
      this.attributesField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string FullPath 
    { 
     get 
     { 
      return this.fullPathField; 
     } 
     set 
     { 
      this.fullPathField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
public partial class getMetadataProjectModuleAttribute 
{ 

    private string nameField; 

    private string typeField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string name 
    { 
     get 
     { 
      return this.nameField; 
     } 
     set 
     { 
      this.nameField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string type 
    { 
     get 
     { 
      return this.typeField; 
     } 
     set 
     { 
      this.typeField = value; 
     } 
    } 
} 

Was sollte funktioniert gut mit der XmlSerializer Klasse.

Sie können ein wenig die generierte Ausgabe bereinigen, indem Sie die leeren Kommentare entfernen und den Namen der Klassen ändern, um camel case zu verwenden (in diesem Fall müssen Sie den tatsächlichen Elementnamen im Attribut angeben Ihre Frage) oder verschieben Sie die Klassen in andere Dateien.

Ich hoffe, es hilft.

+0

Ich kann nur den Projektnamen holen, ich möchte den Modulnamen und Attribute aus dem XML holen, wie soll ich das machen? – Abby