2016-10-31 10 views
1

XMLをオブジェクトに逆シリアル化しようとしていますが、XMLを正しく処理しません。オブジェクト内に作者を移入することはありません。私は、タイトルと著者のリストを含む記事で構成されるオブジェクトを返そうとしています。著者のリストは私の問題であるこのコードには載っていません。私はこのXML操作の初心者として助けてください。逆シリアル化リストを使用してオブジェクトにXMLを変換する

ここで問題を確認できます。 enter image description here

ここにサンプルxmlがあります。

<?xml version="1.0" encoding="UTF-8"?> 
<MedlineCitationSet> 
<Article> 
    <ArticleTitle>Title 1</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Public</LastName> 
      <ForeName>J Q</ForeName> 
      <Initials>JQ</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 2</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>Jane</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 3</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>Jane</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Public</LastName> 
      <ForeName>J Q</ForeName> 
      <Initials>JQ</Initials> 
     </Author> 
    </AuthorList> 
</Article> 
<Article> 
    <ArticleTitle>Title 4</ArticleTitle> 
    <AuthorList> 
     <Author> 
      <LastName>Smith</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
     <Author> 
      <LastName>Doe</LastName> 
      <ForeName>John</ForeName> 
      <Initials>J</Initials> 
     </Author> 
    </AuthorList> 
</Article> 

はここに私のクラス階層です。

[XmlRoot("MedlineCitationSet")] 
public class MedlineCitationSet 
{ 
    [XmlElement("Article")] 
    public List<Article> Articles { get; set; } 
} 

[XmlRoot("Article")] 
public class Article 
{ 
    [XmlElement("ArticleTitle")] 
    public string ArticleTitle { get; set; } 

    [XmlElement("AuthorList")] 
    public List<Author> AuthorList { get; set; } 
} 

public class Author 
{ 
    [XmlElement("LastName")] 
    public string LastName { get; set; } 

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

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

これは私の非直列化コードです。

XmlSerializer serializer = new XmlSerializer(typeof(MedlineCitationSet)); 
using (FileStream fileStream = new FileStream(newPath + @"\XmlToRead\XmlToRead.xml", FileMode.Open)) 
{ 
    MedlineCitationSet result = (MedlineCitationSet)serializer.Deserialize(fileStream); 
} 

答えて

3

この部分:

[XmlElement("AuthorList")] 
public List<Author> AuthorList { get; set; } 

ではなく、あなたのXML内の余分な<Author>レベルで、シリアライザは、著者としてすべての<AuthorList>要素を扱うことを示します。

[XmlArray("AuthorList")] 
[XmlArrayItem("Author")] 
public List<Author> AuthorList { get; set; } 

PS:

これは、この方法で解決することができます。コード内にMedlineCitationSetを生成してシリアライズすることで、シリアライザが現在のシリアライゼーションマッピングの内容を簡単に確認できます。

+0

これは私の問題を解決します。オブジェクト属性は現在正常に移入されます。どうもありがとう。 –

0

あなたが使用する必要があります[のXmlType( "MedlineCitationSet")] [のXmlType( "条")]と[のXmlType( "著者")]あなたのクラスの属性として、私は、少なくともXML定義が欠落している参照クラスの著者。

+0

これらの属性は冗長です。型は互いに直接使用するので、 'XmlSerializer'はそれ以上宣言することなくこの接続を描くことができます。 – Georg

0

XmlArrayItem属性をAuthorListプロパティに追加してみてください。

0

authorクラスのxmlroot属性を調べて、もう一度試してみてください。 xmlserializerが自動で行うことができるという事実の属性décaissを削除することができます。

関連する問題