2017-08-08 35 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はタグ<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であるが、このモデルクラスで正常に動作していること。もう1つの奇妙なこと - そのプロパティはObjects(クラスUserProfileDto)は最後の要素<object>のデータで満たされていますか?

このデシリアライズに対処してください。

+0

:この例では

は、私は、次のXSLT変換を適用します。 XElementを使用するとあなたを助けることができます。 – KamikyIT

+0

送信したxmlの内容は同じです。だからあなたの質問は意味をなさない。さまざまなコンテンツのxmlを表示してから、話し合ってみましょう。 –

+0

Alexander、xmlは正しいです。私はこのXMLを正確に非直列化する必要があります。このxmlドキュメントは、接頭辞のリストと同じオブジェクトの2つのリストを表します。課題は、の2つのタグが異なる意味を有することである。最初のタグは通常のユーザーのリストを表し、2番目のグループ - グループマネージャのリスト – Valentine

答えて

0

この問題の回避策を見つけました。 シリアル化の前にxslt変換を適用してxmlを目的の形式に変換し、結果のxmlをオブジェクトに逆シリアル化します。同じ名前を持つ要素が、それらの背後に別のオブジェクトを持っている場合は、あなたがあなた自身のシリアライズ/ deseralizatonメソッドを使用することができ

<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> 
関連する問題