2017-05-03 1 views
0

Ich versuche, die XmlSerializer Klasse in C# zu verwenden, um XML zu deserialisieren, das ich von jemandem ziehe. Leider sind sie ihr Wurzelelement haben „Mitarbeiter“ genannt, und dann werden die inneren Elemente innerhalb dieses Wurzelelement auch „Mitarbeiter“ genannt:Wie Deserialisieren XML-Datei mit verschachtelten Elementen des gleichen Namens, mit einem der Elemente sind root?

<Employee xmlns="http://www.testxmlns.com/employee"> 
    <Employee> 
     <OtherElement>OE</OtherElement> 
     ... 
    </Employee> 
    <Employee> 
     <OtherElement>OE</OtherElement> 
     ... 
    </Employee> 
</Employee> 

konnte ich find another question that is very similar, aber nicht genau. Hier ist, was mein aktuelles Objekt wie folgt aussieht:

[XmlType("Employee")] 
[XmlRootAttribute(Namespace = "http://www.testxmlns.com/employee", IsNullable = true)] 
public class Employee 
{ 
    [XmlElement("Employee")] 
    public Employee[] InnerEmployee; 

    [XmlElement("OtherElement")] 
    public String OtherElement; 

    ... 
} 

Wenn ich die folgenden ausführen, alles (keine Ausnahmen geworfen) zu funktionieren scheint, aber alles in dem zurückgegebene Objekt ist null, einschließlich der inneren Liste der Mitarbeiter Objekte, die

Employee retObj; 
XmlSerializer serializer = new XmlSerializer(typeof(Employee)); 
using (TextReader sr = new StringReader(xmlString)) 
{ 
    retObj = (Employee)serializer.Deserialize(sr); 
} 
return retObj; 

Jede mögliche Hilfe würde geschätzt: nicht null sollte ich die Eingabe auf dem XML-basiert!

Antwort

1

Sie können in this fiddle sehen, dass, wenn ich Ihren Code nehme und es ausführen ... es funktioniert!

Ich würde jedoch vorschlagen, zwei Klassen zu haben: eine für die 'root' und eine für jedes Kindelement. Dies würde es weniger verwirrend, mit zu arbeiten:

[XmlRoot("Employee", Namespace = "http://www.testxmlns.com/employee")] 
public class EmployeeRoot 
{ 
    [XmlElement("Employee")] 
    public Employee[] Employees { get; set; } 
} 

public class Employee 
{ 
    public string OtherElement { get; set; } 
} 

Sie in this fiddle sehen, dass dies auch funktioniert.

Verwandte Themen