2016-08-05 20 views
0

リストを逆シリアル化しようとしています。 Imは、次のエラーを取得:XmlSerializer名前を付けずにリストを逆シリアル化する

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

のような他のquesitons見ました:{"<user xmlns=''> was not expected.} Deserializing Twitter XMLをが、これはどちらか私の問題を解決していません。

これは

<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> 

クラスは次のように作成されたXMLサンプルです:

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; } 
    } 

はXmlArray、XmlArrayItemまたは要素にリストを変更しようとしています。デシリアライズするときにも同じエラーが発生します。

デシリアライズコードサンプル:

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

これは*有効な*( 'XmlSerializer'によって期待される)xmlではありません。有効なものは '<?xml version =" 1.0 "?>'から始まります。 'Deserialize()'を呼び出す前に、この行を追加することができます。別のものは、配列項目のコンテナ( 'XmlRootAttribute'で表されます)がありません。 [this](http://stackoverflow.com/q/126155/1997232)。 – Sinatr

+0

'XmlSerializer'は、XML宣言が欠けているXMLを処理できます。ただし、XMLには唯一の[ルート要素](https://en.wikipedia.org/wiki/Root_element)が必要です。このXMLには複数のルート要素があるため、実際にはXMLではありません。 – dbc

+0

ルート要素を追加してお知らせください。速い応答をありがとう – RSmart

答えて

0

これは、すべてあなたがXMLの最小限のコントロールを持っているとあまりにも多くのことを変更することの贅沢を持っていないという仮定を前提としています。他の人が指摘しているように、それはよく形成されていません。 XMLと型の変更を最小限に抑えてシリアライズを行う方法の1つです。最初にAuthorizationListタイプを取り除き、承認タイプにXmlType属性を割り当てます(このステップでは、XMLにどのように一致させるかを簡単に指定できます)。

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

public class List { ... } 

... XMLは今では逆シリアル化 "権限" のリストを表し

<ArrayOfAuthorizations> 
... 
</ArrayOfAuthorizations> 

だけでこれです...以下のルート要素であなたのXMLをラップ

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

もう1つの解決策...

を変更してくださいメンバーがAuthorization[](配列型ではなく単数型)であり、XmlElement属性(XmlArrayではない)を持つメンバーがです。 XmlType属性をAuthorizationに適用します(上記の解決方法と同様に、各配列要素に複数の名前が付けられているのでxmlと一致させる)。

[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; } 
} 

は、その後、あなたは、以前のソリューションと同様にそのList<T>ではなく、あなたのAuthorizationList型のインスタンスをデシリアライズ。

AuthorizationList l = FromXml<AuthorizationList>(xml); 

ルートXML要素もその型名に一致する必要があることに注意してください。

<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

私は同じエラーを与えている、なぜコードで使用されていない場合、ルート要素でラップするのか分からない。 – RSmart

+0

シリアライザを満たすためにあなたの 'AuthorizationList'型を純粋に定義する必要がないことを明確にする1つのアプローチを示したところです。 'ArrayOf ...'ルート要素は 'XmlSerializer'が期待するデフォルトの規則です。' ... 'はジェネリック型パラメータの名前です。ここでもまた、ルート要素要件を満たすために 'AuthorizationList'を定義する代わりに、' List 'を単純化して利用したいと仮定しています。多分あなたはそれを必要とするので、あなたの 'AuthorizationList'を保持する別のアプローチを編集して追加しますか? – blins

+0

あなたの 'AuthorizationList'タイプを保持し、それをxmlのルートにする代わりの方法を示す私の編集を見てください。 – blins

関連する問題