使用内部数组反序列化 xml

本文关键字:反序列化 xml 数组 内部 | 更新日期: 2023-09-27 18:37:18

>我正在尝试反序列化简单的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; }
}

因此,当我运行此代码时,我得到了反序列化的同义词库对象,其中包含解析的元数据和 1 个带有填充termsynonym字段的条目。我无法在这里获得所有条目。

当我注释掉Synonym字段时,它开始在同义词库对象中给我 2 个条目。我无法将条目包装在 <entries> 标记中,因为它是我使用此 xml 文件馈送的应用程序的某种内部格式。

有人知道如何正确解析此xml文件吗?我尝试搜索解决方案,但此 xml 看起来与示例中的 xml 完全不同。

使用内部数组反序列化 xml

好的,所以如果你需要保留术语字段的同义词字段数组,你需要将你的 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();
        }
相关文章: