如何序列化';任何';没有包含元素的元素
本文关键字:元素 包含 任何 序列化 | 更新日期: 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
如果XmlElement
和XmlAnyElement
被组合并应用于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属性。