【问题标题】:Deserialization XML to object with lists将 XML 反序列化为带有列表的对象
【发布时间】:2016-10-31 22:43:33
【问题描述】:

我正在尝试将 xml 反序列化为一个对象,但它没有正确地通过 xml。它不会填充对象中的作者。我正在尝试返回一个对象,该对象由包含标题和作者列表的文章组成。作者列表不会填充在此代码中,这是我的问题。请帮忙,因为我是这个 XML 操作的新手。

在这里,您可以看到问题。

这里是示例 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);
}

【问题讨论】:

    标签: c# xml xml-deserialization


    【解决方案1】:

    这部分:

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

    表示序列化程序将每个 &lt;AuthorList&gt; 元素视为作者,而不是 xml 中额外的 &lt;Author&gt; 级别。

    可以这样解决:

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

    附言。您可以通过在代码中生成 MedlineCitationSet 并对其进行序列化,轻松查看序列化程序对当前序列化映射的影响。

    【讨论】:

    • 这解决了我的问题。对象属性现在已成功填充。非常感谢。
    【解决方案2】:

    您应该在您的类中使用 [XmlType("MedlineCitationSet")] [XmlType("Article")] 和 [XmlType("Author")] 作为属性,我发现这至少缺少 Author 类中的 xml 定义。

    【讨论】:

    • 这些属性是多余的。由于类型直接相互使用,XmlSerializer 无需进一步声明即可绘制此连接。
    【解决方案3】:

    尝试将XmlArrayItem-属性添加到AuthorList 属性。

    【讨论】:

      【解决方案4】:

      尝试将 xmlroot 属性添加到作者类并重试。您可以删除 xmlserializer 可能是自动的事实的所有属性 décaissé。

      【讨论】:

        猜你喜欢
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多