2016-11-07 3 views
0

私は与えられた以下のサンプルXMLを持っています。私はそれを逆直列化する必要があります。リストアイテム内のリストを非直列化

private void button1_Click(object sender, EventArgs e) 
    { 
     XmlSerializer xmlIn = new XmlSerializer(typeof(UserItems)); 
     StreamReader srIn = new StreamReader("c:\\address.xml"); 
     UserItems uiItems; 

     uiItems = (UserItems)xmlIn.Deserialize(srIn); 

     srIn.Close(); 
    } 
    } 

    [XmlRoot("Users")] 
    public class UserItems 
    { 
    private List<UserItem> p_liUserItems; 

    [XmlAttribute("filename")] public string FileName { get; set; } 

    [XmlElement("User")] 
    public List<UserItem> Users 
    { 
     get 
     { 
     return p_liUserItems; 
     } 
     set 
     { 
     p_liUserItems = value; 
     } 
    } 
    } 

    [Serializable] 
    public class UserItem 
    { 
    private List<AddressItem> p_liAddressItems = new List<AddressItem>(); 

    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("age")] 
    public string Age { get; set; } 

    [XmlElement("Address")] 
    public List<AddressItem> Addresses 
    { 
     get 
     { 
     return p_liAddressItems; 
     } 
     set 
     { 
     p_liAddressItems = value; 
     } 
    } 
    } 

    [Serializable] 
    public class AddressItem 
    { 
    [XmlAttribute("street")] 
    public string Street { get; set; } 
    [XmlAttribute("city")] 
    public string City { get; set; } 
    [XmlAttribute("state")] 
    public string State { get; set; } 
    [XmlAttribute("zip")] 
    public string ZipCode { get; set; } 
    } 

これは、ポイントまで、細かいデシリアライズ:

<?xml version="1.0" encoding="utf-16"?> 
<Users filename="testfile"> 
    <User name="John Doe" age="51"> 
     <Addresses> 
      <Address street="1511 Smith Pl." city="Boulder" state="CO" zip="80000" /> 
      <Address street="1820 Main St." city="Lafayette" state="CO" zip="80100" /> 
     </Addresses> 
    </User> 
    <User name="Jeff Jones" age="35"> 
     <Addresses> 
      <Address street="2111 Jefferson Rd.." city="Colorado Springs" state="CO" zip="80099" /> 
     </Addresses> 
    </User> 
</Users> 

私は、次のコードを使用しています。私は各ユーザーの情報を取得しますが、各ユーザーのアドレスは取得できません。各ユーザーには空白のアドレスリストがありますコレクションアイテム内のコレクションをデシリアライズする方法を教えてください。

+0

XMLで '' '[XmlElement(" Address ")]' '' =>しかし、XMLで '' '' ' – tym32167

答えて

1

AddressesXmlElementですが、1つは配列をラップします。あなたはは、ラッパークラスをしたいですか場合、

[XmlArray("Addresses")] 
[XmlArrayItem("Address")] 
public List<AddressItem> Addresses 
{ 
    get 
    { 
     return p_liAddressItems; 
    } 
    set 
    { 
     p_liAddressItems = value; 
    } 
} 

代わり::

[Serializable] 
public class UserItem 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    [XmlAttribute("age")] 
    public string Age { get; set; } 

    [XmlElement("Addresses")] 
    public AddressWrapper Addresses { get; set; } 
} 

[Serializable] 
public class AddressWrapper 
{ 
    [XmlElement("Address")] 
    public List<AddressItem> Addresses { get; set; } 
} 

あなたは(デ)Addressesのラッパークラスを作成し、飾るために持っ防ぐためにXmlArrayXmlArrayItemを使用して、それをシリアル化することができますWrapping Serialized Array Elements with the Name of the Arrayも参照してください。

+1

ああ、あなたはあまりにも速いですね:) – tym32167

+0

どちらもうまくいきません。 Deserializeの呼び出しで次のようなエラーが発生します。System.Xml.dllに「System.InvalidOperationException」という型の未処理の例外が発生しました。 – Scott

+0

@Scottは両方とも質問のXMLに対応しています。実際のエラーが出るまでInnerExceptionsをクリックし、それを読んで研究してください。 – CodeCaster

関連する問題