XML反序列化,具有相同名称但内容不同的多个元素

时间:2017-08-08 11:50:36

标签: c# xml xml-deserialization

请帮我构建用于反序列化XML的模型,该模型具有相同名称但内容不同的多个标记。

<?xml version="1.0" encoding="utf-16"?>
<found>
<prefixes>
    <prefix name="Name1">Val1</prefix>
    <prefix name="Name2">Val2</prefix>
</prefixes>
<objects>
    <object handle="0">
        <User>
            <familyName>Family</familyName>
            <givenName>Given1</givenName>
        </User>
    </object>
    <object handle="0">
        <User>
            <familyName>Family2</familyName>
            <givenName>Given2</givenName>
        </User>
    </object>
</objects>
<objects>
    <object handle="0">
        <User>
            <familyName>Family3</familyName>
            <givenName>Given3</givenName>
        </User>
    </object>
    <object handle="0">
        <User>
            <familyName>Family4</familyName>
            <givenName>Given4</givenName>
        </User>
    </object>
</objects>

此XML包含标记为<objects>的2个集合。出于调试目的,我对<objects>个标签使用了相同的内容,但实际上它们会有所不同。此外,每个集合的内容都可能发生变化,但文档的结构是相同的:它包含前缀集合和2个对象集合。

以下是用于序列化/反序列化此xml的数据对象:

[XmlRoot(ElementName = "found", IsNullable = true)]
public class UserProfileDto
{
    [XmlArray("prefixes", Order = 0)]
    [XmlArrayItem("prefix", IsNullable = false)]
    public PrefixDto [] Prefixes { get; set; }

    [XmlArray("objects", Order = 1)]
    [XmlArrayItem(ElementName = "object", Type = typeof(ObjectDto), IsNullable = false)]
    public ObjectDto[] Objects { get; set; }

    [XmlArray("objects", Order = 2)]
    [XmlArrayItem(ElementName = "object", Type = typeof(ObjectDto), IsNullable = false)]
    public ObjectDto[] AnotherObjects { get; set; }
}

public class PrefixDto
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlText]
    public string Value { get; set; }
}

public class ObjectDto
{
    [XmlElement("User")]
    public UserDto User { get; set; }
}

[Serializable]
public class UserDto
{
    [XmlElement("familyName")]
    public string FamilyName { get; set; }

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

问题是 - 序列化适用于此模型类,但是在反序列化时,属性AnotherObjects始终为null。另一个奇怪的事情 - 属性Objects(在类UserProfileDto中)填充了最后一个元素<object>的数据。

请帮助处理这种反序列化。

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。 在序列化之前,应用xslt转换将xml转换为所需的格式,然后将生成的xml反序列化为对象。

对于这个例子,我应用了以下xslt转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/found">
  <found>
    <xsl:apply-templates select="prefixes"/>
    <xsl:apply-templates select="objects[position()=1]"/>
    <xsl:apply-templates select="objects[position()=2]"/>
  </found>
</xsl:template>

<xsl:template match="prefixes">
  <prefixes>
    <xsl:copy-of select="*" />
  </prefixes>
</xsl:template>

<xsl:template match="objects[position()=1]">
  <hitObjects>
    <xsl:copy-of select="*" />
  </hitObjects>
</xsl:template>

<xsl:template match="objects[position()=2]">
  <ancillaryObjects>
     <xsl:copy-of select="*" />
  </ancillaryObjects>
</xsl:template>

</xsl:stylesheet>