XML 多个同名不同内容的元素反序列化
XML Deserialization with multiple elements with same name but different content
请帮助我建立反序列化 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 包含 2 个包含在标签 <objects>
中的集合。出于调试目的,我对两个 <objects>
标签使用了相同的内容,但实际上它们会有所不同。此外,每个集合的内容可能会发生变化,但文档的结构是相同的:它包含前缀集合和 2 个对象集合。
这是用于 serialize/deserialize 这个 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; }
}
问题是 - 序列化适用于此模型 class,但是在反序列化时,属性 AnotherObjects
始终为空。另一个奇怪的事情是 属性 Objects
(在 class UserProfileDto
中)填充了来自最后一个元素 <object>
.
的数据
请帮助处理这个反序列化。
我找到了解决此问题的方法。
在序列化之前应用 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>
请帮助我建立反序列化 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 包含 2 个包含在标签 <objects>
中的集合。出于调试目的,我对两个 <objects>
标签使用了相同的内容,但实际上它们会有所不同。此外,每个集合的内容可能会发生变化,但文档的结构是相同的:它包含前缀集合和 2 个对象集合。
这是用于 serialize/deserialize 这个 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; }
}
问题是 - 序列化适用于此模型 class,但是在反序列化时,属性 AnotherObjects
始终为空。另一个奇怪的事情是 属性 Objects
(在 class UserProfileDto
中)填充了来自最后一个元素 <object>
.
请帮助处理这个反序列化。
我找到了解决此问题的方法。 在序列化之前应用 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>