2017-06-23 3 views
0

ich diese XML-Struktur haben:C# eine XML zu einer Objektliste Deserialisieren

<?xml version="1.0" encoding="UTF-8" ?> 
<response uri="/api/" action="EXPORT"> 
<result> 
    <rows> 
     <row> 
      <column name="Name1">Value1</column> 
      <column name="Name2">Value2</column> 
     </row> 
     <row> 
      <column name="Name1">Value1</column> 
      <column name="Name2">Value2</column> 
     </row> 
    </rows> 
</result> 
</response> 

Ich versuche, die XML-Daten in einer Liste Objekt deserialisiert wie so:

List<ModelXML> model; 

     using (TextReader reader = new StringReader(xml_str)) 
     { 
      System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(List<ModelXML>), 
       new XmlRootAttribute("rows")); 
      model= (List<ModelXML>)deserializer.Deserialize(reader); 
     } 

Meine Parameter in der ModelXML Klasse:

[XmlElement("Name1")] 
    public string Name1{ set; get; } 
    [XmlElement("Name2")] 
    public string Name2{ set; get; } 

Und schließlich bin ich diesen Fehler:

The '=' character, hexadecimal value 0x3D, cannot be included in a name. Line 1, position 13.

Was mache ich falsch? Vielen Dank.

+0

Der Code scheint korrekt zu sein. Haben Sie versucht, zu überprüfen, ob in der Eingabezeichenfolge versteckte Zeichen enthalten sind? Ist Ihre Eingabezeichenfolge aus einer Datei? – ngeksyo

Antwort

1

Hier, wie Sie Ihr Problem

Erste Sie Ihr Modell

[XmlRoot(ElementName = "column")] 
    public class Column 
    { 
     [XmlAttribute(AttributeName = "name")] 
     public string Name { get; set; } 
     [XmlText] 
     public string Text { get; set; } 
    } 

    [XmlRoot(ElementName = "row")] 
    public class Row 
    { 
     [XmlElement(ElementName = "column")] 
     public List<Column> Column { get; set; } 
    } 

    [XmlRoot(ElementName = "rows")] 
    public class Rows 
    { 
     [XmlElement(ElementName = "row")] 
     public List<Row> Row { get; set; } 
    } 

    [XmlRoot(ElementName = "result")] 
    public class Result 
    { 
     [XmlElement(ElementName = "rows")] 
     public Rows Rows { get; set; } 
    } 

    [XmlRoot(ElementName = "response")] 
    public class Response 
    { 
     [XmlElement(ElementName = "result")] 
     public Result Result { get; set; } 
     [XmlAttribute(AttributeName = "uri")] 
     public string Uri { get; set; } 
     [XmlAttribute(AttributeName = "action")] 
     public string Action { get; set; } 
    } 

Dann das Deserialisierungsereignis Code wie folgt

verwenden ändern müssen lösen können
//here I'm trying to load the file from the disk but you can do the same by passing a string 

    Response model; 

      var xml = File.ReadAllText("file.xml"); 
      using (TextReader reader = new StringReader(xml)) 
      { 
       System.Xml.Serialization.XmlSerializer deserializer = new System.Xml.Serialization.XmlSerializer(typeof(Response)); 
       model = (Response)deserializer.Deserialize(reader); 
      } 

Mehr Sie können Ihre Zeilen zugreifen wie diese

var rows = model.Result.Rows; 

// hoffen, dass diese

+0

Vielen Dank für Ihre Antwort, ich habe bereits meinen Code für das, was Sie vorschlagen, aber ich bekomme immer noch den gleichen Fehler, jede Idee, warum immer noch passiert? Vielen Dank. – elunap

+0

Ich sollte raten, dass die XML, die Sie gepostet haben, nicht vollständig ist, weil ich es ausprobiert habe und es funktioniert, könnten Sie bitte die vollständige XML posten, um das Problem zu reproduzieren –

+0

Ich habe nicht bemerkt, dass ich einen Regrex zum Entfernen von Leerzeichen verwendet habe Problem, jetzt funktioniert es, vielen Dank! – elunap

0

helfen kann, wenn ich Ihren Code ausführen ich die folgende Ausnahme erhalten.

System.InvalidOperationException: 'There is an error in XML document (2, 2).'

Innerexception

InvalidOperationException: < response xmlns='' > was not expected.

Dies ist, weil Sie das äußerste Element als Stammelement definieren muss und nicht ein tiefer in der Struktur wie Ihr versucht zu tun. Eine Möglichkeit, dies zu lösen, ist die Definition aller notwendigen Modellklassen wie @BRAHIM Kamel.


, wenn Sie nicht wollen, so viele Modellklassen haben, und Sie über die Leistung zu viel nicht kümmern Sie dies auch tun könnte.

[XmlRoot("row")] 
public class ModelXML 
{ 
    public class Column 
    { 
     [XmlAttribute("name")] 
     public string Name { set; get; } 
     [XmlText] 
     public string Value { set; get; } 
    } 

    [XmlElement("column")] 
    public List<Column> Columns { get; set; } 
} 

IEnumerable<T> Deserialize<T>(IEnumerable<XElement> elements) 
{ 
    foreach (var element in elements) 
    { 
     using (var reader = XDocument.Parse(element.ToString()).CreateReader()) 
     { 
      XmlSerializer deserializer = new XmlSerializer(typeof(T)); 
      yield return (T)deserializer.Deserialize(reader); 
     } 
    } 
} 

var document = XDocument.Parse(xml_str); 
var collection = Deserialize<ModelXML>(
    document.XPathSelectElements("response/result/rows/row")); 
Verwandte Themen