2017-08-08 63 views
0

請幫助我使用具有相同名稱但內容不同的多個標記對XML進行反序列化的模型。具有相同名稱但內容不同的多個元素的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個對象集合。

這裏是用來序列化/反序列化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始終爲空。另一個奇怪的事情 - 是屬性Objects(在類UserProfileDto)充滿了來自最後一個元素<object>的數據。

請幫忙處理這個反序列化。

+0

如果你有相同名稱的元素,但他們背後不同的對象,你可以使用自己的序列化/ deseralizaton方法。使用XElement可以幫助你。 – KamikyIT

+0

您提交的xml具有相同的內容。所以你的問題沒有意義。用不同的內容顯示xml,然後我們將討論。 –

+0

Alexander,xml正在更正。我需要反序列化這個XML。這個xml文檔代表了相同對象的前綴列表和2個列表。挑戰在於2個標籤具有不同的含義,例如第一個標記代表常規用戶列表,第二個標記 - 組管理員列表 – Valentine

回答

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> 
相關問題