使用内部数组反序列化xml

时间:2016-03-03 07:37:01

标签: c# xml serialization

我正在尝试反序列化简单的xml文件:

<thesaurus xmlns="http://marklogic.com/xdmp/thesaurus">
    <metadata>
    </metadata>
    <entry>
        <term>a</term>
            <synonym>
                <term>as</term>
            </synonym>
    </entry>
    <entry>
        <term>b</term>
            <synonym>
                <term>bs</term>
            </synonym>
            <synonym>
                <term>bss</term>
            </synonym>
    </entry>
</thesaurus>

我正在使用XmlSerializer:

var xmlSerializer = new XmlSerializer(typeof(Thesaurus));

var thesaurus = xmlSerializer.Deserialize(stream);

我的模型看起来像这样:

[Serializable]
[XmlRoot("thesaurus", Namespace = "http://marklogic.com/xdmp/thesaurus")]
public class Thesaurus
{
    [XmlElement("metadata")]
    public Metadata Metadata { get; set; }
    [XmlElement("entry")]
    public List<Entry> Entries { get; set; }
}

public class Metadata
{

}
public class Entry
{
    [XmlElement("term")]
    public string Term { get; set; }
    [XmlElement("synonym")]
    public String[] Synonym { get; set; }
}

因此,当我运行此代码时,我会使用已解析的元数据反序列化同义词库对象,并使用已填充termsynonym字段的 1 条目进行反序列化。我无法在这里获得所有条目。

BUT

当我注释掉Synonym字段时,它开始在同义词库对象中提供 2 条目。我无法在<entries>标记中包装条目,因为它是我用这个xml文件提供的应用程序的一些内部格式。

任何人都有任何想法如何正确解析这个xml文件?我试着寻找一个解决方案,但是这个xml看起来与示例中的xml完全不同。

1 个答案:

答案 0 :(得分:1)

好的,如果您需要保留 synonim 字段数组字段,则需要将Entry类更改为以下内容:

public class Entry
{
     [XmlElement("term")]
     public string Term { get; set; }            

     [XmlElement("synonim")]
     public Term[] Synonym { get; set; }
}

您还需要添加额外的一个:

public class Term
{
    [XmlElement("term")]
    public string Value { get; set; }
}

这样你就可以得到你需要的东西。 因此,附加类添加了额外的层次结构级别。

请在下面找到测试代码:

        var xmlSerializer = new XmlSerializer(typeof(Thesaurus));

        var r = new Thesaurus();
        r.Entries = new List<Entry>();
        r.Metadata = new Metadata();

        r.Entries.Add(new Entry()
        {
            Synonym = new Term[] { new Term(){Value = "1"}, new Term() {Value = "2"},   },
            Term = "Term1"
        });

        r.Entries.Add(new Entry()
        {
            Synonym = new Term[] { new Term() { Value = "3" }, new Term() { Value = "4" }, },
            Term = "Term2"
        });

        using (TextWriter writer = new StreamWriter(@"c:\111.xml"))
        {
            xmlSerializer.Serialize(writer, r);
            writer.Close();
        }


        using (TextReader reader = new StreamReader(@"c:\111.xml"))
        {
            Thesaurus tt = xmlSerializer.Deserialize(reader) as Thesaurus;
            Console.Write(tt.Entries.Count);
            reader.Close();
        }