如何序列化';任何';没有包含元素的元素

本文关键字:元素 包含 任何 序列化 | 更新日期: 2023-09-27 18:26:26

我需要序列化一些数据,以通过web服务作为消息传递,web服务将根据模式验证数据。我已经建立了一个对象模型,但我在一个小区域缺少一些东西。

这是模式:

<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; }
    }
}

我在Any元素上使用XmlElementAttribute,以便将其序列化为没有容器的元素序列,但是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"元素序列?

如何序列化';任何';没有包含元素的元素

我终于有时间坐下来创建了一个只关注特定领域的测试项目,并得出了以下结论。

<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属性