3

スキーマに対してデータを検証する Web サービスを介してメッセージとして渡すデータをシリアル化する必要があります。オブジェクト モデルを作成しましたが、1 つの小さな領域で何かが欠けています。

これはスキーマです:

<xs:element name="UserDetailsMessage" minOccurs="0">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="URDUSERDETAILS" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:any processContents="skip" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

これは私のクラスです:

[Serializable()] public class UserDetailsMessage
{
    private USERDETAILS myUserDetails;

    [XmlElementAttribute("USERDETAILS")]
    public USERDETAILS USERDETAILS {
        get {
            if (myUserDetails == null)
                myUserDetails = new USERDETAILS();
            return this.myUserDetails;
        }
        set { this.myUserDetails = value; }
    }

    public bool URDUSERDETAILSSpecified {
        get {
            if (myUserDetails == null)
                return false;
            return true;
        }
    }

}

[Serializable()] public class USERDETAILS
{
    private List<System.Xml.XmlElement> anyField;

    [XmlAnyElementAttribute(), XmlElementAttribute("Any")]
    public List<System.Xml.XmlElement> Any {
        get { return this.anyField; }
        set { this.anyField = value; }
    }

}

XmlElementAttributeコンテナーなしで要素のシーケンスとしてシリアル化するために、要素にを使用してAnyいますが、XML 出力は思ったほど出力されません。

<UserDetailsMessage>
    <USERDETAILS>
        <Any>
            <TEST_DATA_HERE />
        </Any>
    </USERDETAILS>
</UserDetailsMessage>

これにより、XmlDocument.Validateメソッドは次の検証エラーを出力します。The 'Any' element is not declared

私の知る限り、作成しようとしている出力は次のようになります。

<UserDetailsMessage>
    <USERDETAILS>
        <TEST_DATA_HERE />
    </USERDETAILS>
</UserDetailsMessage>

この出力を生成するために何らかの方法でXmlElementAttributeとやり取りしているのでしょうか、それともどこかで明らかな間違いを犯したのでしょうか? XmlAnyElementAttributeまたは、要素を含まない「Any」要素のシーケンスをどのようにシリアル化する必要がありますか?

4

1 に答える 1

3

私はついに座って、特定の関心領域のみでテストプロジェクトを作成する時間があり、以下にたどり着きました.

<Serializable()> Public Class NotificationMessage

    Private myUserData As UserData

    Public Sub New()
        myUserData = New UserData()
    End Sub

    <System.Xml.Serialization.XmlElementAttribute("UserData")> _
    Public Property UserData() As UserData
        Get
            Return Me.myUserData
        End Get
        Set(value As UserData)
            Me.myUserData = value
        End Set
    End Property

End Class

<Serializable()> Public Class UserData

    Private anyField As List(Of System.Xml.XmlElement)

    Public Sub New()
        Me.anyField = New List(Of System.Xml.XmlElement)()
    End Sub

    <XmlAnyElementAttribute()>
    Public Property Any() As List(Of System.Xml.XmlElement)
        Get
            Return Me.anyField
        End Get
        Set(value As List(Of System.Xml.XmlElement))
            Me.anyField = value
        End Set
    End Property
End Class

これは、XmlElementXmlAnyElementを組み合わせて UserData クラスの Any プロパティに適用した場合の出力です。

<NotificationMessage>
  <UserData>
    <Any>
      <TEST_DATA_HERE />
    </Any>
  </UserData>
</NotificationMessage>

これは、 のみXmlElementが適用された場合の出力です。

<NotificationMessage>
  <UserData>
    <Any>
      <TEST_DATA_HERE />
    </Any>
  </UserData>
</NotificationMessage>

これは、XmlAnyElement適用されたもののみを含む出力です。

<NotificationMessage>
  <UserData>
    <TEST_DATA_HERE />
  </UserData>
</NotificationMessage>

したがって、「Any」要素のシーケンスをシリアル化するには、XmlAnyElement 属性のみを単独で使用する必要があることがわかります。

于 2013-08-09T10:43:05.063 に答える