【发布时间】:2011-12-01 04:14:09
【问题描述】:
我正在向外部发送 XML。
其中一个名为“datafield”的节点有一个名为“value”的元素。这可能包含普通的文本内容,或一个 html 内容(我需要将其包装在 CData 中)。
所以,我创建了一个基类(ProvisionDataField),其中继承了 2 个类(ProvisionTextField 和 ProvisionCDataField),如下所示:
<XmlInclude(GetType(ProvisionTextField))>
<XmlInclude(GetType(ProvisionCDataField))>
Public MustInherit Class ProvisionDataField
<XmlAttribute("datatype")>
Public Property DataType As String
<XmlElement("name")>
Public Property Name As String
End Class
Public Class ProvisionCDataField
Inherits ProvisionDataField
<XmlIgnore()>
Public Property ValueContent As String
<XmlElement("value")>
Public Property Value() As XmlCDataSection
Get
Dim doc As New XmlDocument
Return doc.CreateCDataSection(ValueContent)
End Get
Set(ByVal value As XmlCDataSection)
ValueContent = value.Value
End Set
End Property
End Class
Public Class ProvisionTextField
Inherits ProvisionDataField
<XmlElement("value")>
Public Property Value As String
End Class
当我序列化时,我得到这样的东西:
<entitydata entitytype="company">
<datafield xsi:type="ProvisionTextField" datatype="string">
<name>companyAcronym</name>
<value>testCompany</value>
</datafield>
<datafield xsi:type="ProvisionCDataField" datatype="string">
<name>ssocontent</name>
<value><![CDATA[<html><body> HTML Content</body></html>]]></value>
</datafield>
</entitydata>
除了被告知我必须从 xml 中删除“xsi:type”之外,一切都很好。因此,我需要生成的 xml 看起来像这样:
<entitydata entitytype="company">
<datafield datatype="string">
<name>companyAcronym</name>
<value>testCompany</value>
</datafield>
<datafield datatype="string">
<name>ssocontent</name>
<value><![CDATA[<html><body> HTML Content</body></html>]]></value>
</datafield>
</entitydata>
这可能吗?
【问题讨论】:
-
没有
xsi:type,XML 的接收者如何知道存在哪种类型? -
只是为了提供更多信息,我正在使用 POX(普通旧 XML)与外部服务(用 Java 编写)进行通信。我没有手动编写 xml,而是创建了类并使用 xml 序列化来生成 xml。 “类型”只是我使用继承的结果。另一个系统根本不知道这种类型,也不想要它。
标签: .net xml vb.net xml-serialization cdata