2016-08-05 9 views
0

Versuchen, Liste zu deserialisieren. Im den folgenden Fehler erhalten:XmlSerializer Deserialisieren Liste ohne Namespace

System.InvalidOperationException: There is an error in XML document (1, 2). ---> System.InvalidOperationException: was not expected.

Sah andere quesitons wie: {"<user xmlns=''> was not expected.} Deserializing Twitter XML aber das ist mein Problem nicht entweder lösen.

Dies ist ein XML-Beispiel

<authorizations> 
    <id>111</id> 
    <name>Name 1</name> 
    <Lists> 
    <List> 
     <id>1</id> 
     <id>2</id> 
    </List> 
    </Lists> 
</authorizations> 
<authorizations> 
    <id>222</id> 
    <name>Name 2</name> 
    <List /> 
</authorizations> 
<authorizations> 
    <id>333</id> 
    <name>Name 3</name> 
    <List /> 
</authorizations> 

Die Klasse werden wie folgt erstellt:

public class Authorization 
    { 
     [XmlElement("id")] 
     public string Id{ get; set; } 
     [XmlElement("name")] 
     public string Name{ get; set; } 
     [XmlArray("Lists")] 
     [XmlArrayItem("List")] 
     public List[] Items{ get; set; } 
    } 

    public class List 
    { 
     [XmlElement("id")] 
     public string Id{ get; set; } 
    } 

    public class AuthorizationList 
    { 
     [XmlArray("authorizations")] 
     public Authorization Authorizations{ get; set; } 
    } 

versucht haben, um die Liste zu XmlArray, XmlArrayItem oder Element zu ändern. aber immer noch den gleichen Fehler, wenn ich deserialize.

Deserialisieren Codebeispiel:

public static T FromXml<T>(string xmlString) 
    { 
     T obj = default(T); 

     if (!string.IsNullOrWhiteSpace(xmlString)) 
     { 
      using (var stringReader = new StringReader(xmlString)) 
      { 
       var xmlSerializer = new XmlSerializer(typeof(T)); 

       obj = (T)xmlSerializer.Deserialize(stringReader); 
      } 
     } 

     return obj; 
    } 
+0

Dies ist kein * valide * (erwartet von 'XmlSerializer') xml. Eine gültige beginnt mit ''. Sie können versuchen, diese Zeile vor dem Aufruf von 'Deserialize()' hinzuzufügen. Eine andere Sache ist der fehlende Container (bezeichnet durch "XmlRootAttribute") für Array-Elemente, siehe z.B. [dies] (http://stackoverflow.com/q/126155/1997232). – Sinatr

+0

'XmlSerializer' kann XML verarbeiten, dem eine XML-Deklaration fehlt. Das XML muss jedoch nur ein einziges [root element] (https://en.wikipedia.org/wiki/Root_element) haben. Dieses XML hat mehrere Wurzelelemente, also ist es überhaupt kein XML. – dbc

+0

Probieren Sie ein Root-Element hinzufügen und lassen Sie es wissen.Danke für die schnellen Antworten – RSmart

Antwort

0

Das ist alles auf der Annahme, dass Sie eine minimale Kontrolle über die xml haben und haben nicht den Luxus, dass zu viel zu ändern. Wie andere bemerkt haben, ist es nicht gut geformt. Hier ist eine Möglichkeit, die Serialisierung mit minimalen Änderungen an XML und Typen zu arbeiten. Zuerst werden Sie Ihren AuthorizationList Typ los und weisen Sie Ihrem Autorisierungstyp ein XmlType Attribut zu (dieser Schritt dient dazu, einfach den Namen zu pluralieren, um zu entsprechen, wie Ihr xml es hat).

[XmlType("authorizations")] 
public class Authorization { ... } 

public class List { ... } 

Wickeln Sie Ihre xml in der folgenden Root-Element ...

<ArrayOfAuthorizations> 
... 
</ArrayOfAuthorizations> 

Die xml jetzt eine Liste von "Berechtigungen" so zu deserialize darstellt, ist nur diese ...

List<Authorization> l = FromXml<List<Authorization>>(xml); 

Eine andere Lösung ...

Ändern Sie die Authorizations Mitglied der Typ Authorization[] (Array-Typ statt Singular) und ein XmlElement Attribut haben (nicht XmlArray). Wenden Sie das XmlType-Attribut auf die Authorization an (wie bei der obigen Lösung entspricht dies der XML-Datei, da sie für jedes Array-Element den pluralen Namen hat).

[XmlType("authorizations")] 
public class Authorization 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
    [XmlElement("name")] 
    public string Name { get; set; } 
    [XmlArray("Lists")] 
    [XmlArrayItem("List")] 
    public List[] Items { get; set; } 
} 

public class List 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
} 

public class AuthorizationList 
{ 
    [XmlElement("authorizations")] 
    public Authorization[] Authorizations { get; set; } 
} 

Dann deserialisieren Sie Instanz Ihrer AuthorizationList Typ eher, dass List<T> wie bei der vorherigen Lösung.

AuthorizationList l = FromXml<AuthorizationList>(xml); 

Beachten Sie, dass das Stamm-XML-Element auch diesen Typnamen ebenfalls übereinstimmen muss.

<AuthorizationList> 
<authorizations> 
    <id>111</id> 
    <name>Name 1</name> 
    <Lists> 
    <List> 
     <id>1</id> 
     <id>2</id> 
    </List> 
    </Lists> 
</authorizations> 
<authorizations> 
    <id>222</id> 
    <name>Name 2</name> 
    <List /> 
</authorizations> 
<authorizations> 
    <id>333</id> 
    <name>Name 3</name> 
    <List /> 
</authorizations> 
</AuthorizationList> 
+0

Gibt mir den gleichen Fehler, und verstehe nicht, warum mit Wurzelelement umbrechen, wenn es nicht im Code verwendet wird. – RSmart

+0

Ich habe nur einen Ansatz gezeigt, der klarstellt, dass Sie Ihren Typ "AuthorizationList" nicht nur definieren müssen, um den Serializer zu erfüllen. Das 'ArrayOf ...' Wurzelelement ist die Standardkonvention, die der 'XmlSerializer' erwartet, wobei' ... 'der Name des generischen Typparameters ist. Auch hier wird davon ausgegangen, dass Sie die Liste "" vereinfachen und einfach nutzen möchten, anstatt "AuthorizationList" definieren zu müssen, nur um die Root-Element-Anforderung zu erfüllen. Ich werde einen alternativen Ansatz bearbeiten und hinzufügen, der Ihre 'AuthorizationList' enthält, da Sie das vielleicht brauchen? – blins

+0

Sehen Sie meine Bearbeitung, die eine Alternative zeigt, die Ihren 'AuthorizationList' Typ behält und ihn zum Stamm in der XML macht. – blins

Verwandte Themen