【发布时间】:2013-12-23 23:38:59
【问题描述】:
我在反序列化以下 XML 时遇到了一点问题。我可以很好地填充订单,但嵌套的包给我带来了一些困难。作为肥皂消息的消息在序列化之前被清除。我认为问题出在包标签中的 XSI 属性上?
请注意:以下 XML 来自 SOAP 消息,它是从 getSoapBody(string) 函数返回的。所有其他(大约 40 个)soap 响应都很好,它只是我遇到问题的双重嵌套 suff。
<?xml version="1.0" encoding="utf-8"?>
<Orders>
<Order>
<OrderNumber xsi:type="xsd:int">12345</OrderNumber>
<Promotion xsi:type="xsd:string" />
<Agent_Contact xsi:type="xsd:string" />
<Packages>
<Package>
<OrderPackageType_ID xsi:type="xsd:int">1</OrderPackageType_ID>
<Title_ID xsi:type="xsd:int">1</Title_ID>
<StartIssue xsi:type="xsd:string">November 2010</StartIssue>
<EndIssue xsi:type="xsd:string" />
</Package>
<Package>
<OrderPackageType_ID xsi:type="xsd:int">2</OrderPackageType_ID>
<Title_ID xsi:type="xsd:int">1</Title_ID>
<StartIssue xsi:type="xsd:string">October 2010</StartIssue>
<EndIssue xsi:type="xsd:string" />
</Package>
</Packages>
</Order>
<Order> .... </Order>
</Orders>
反序列化的代码如下
NameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
'Initialize our parser context for the xsi namespace
Context = New XmlParserContext(Nothing, NameSpaceManager, Nothing, XmlSpace.None)
'Set up our reader settings
ReaderSettings = New XmlReaderSettings()
ReaderSettings.ConformanceLevel = ConformanceLevel.Fragment
'getSoapBody(Response) rips out the env stuff and sets up for serialization this works
'fine and I can populate all other SOAP messages fine. It just returns elements inside
'the SOAP response body
Reader = XmlReader.Create(New StringReader(GetSoapBody(Response)), ReaderSettings, Context)
If Deserializer.CanDeserialize(Reader) Then
'Deserialize here
ResponseObject = CType(Deserializer.Deserialize(Reader), U)
Else
Throw New SerializationException("Unable to deserialize class object")
End If
订单很好地填充到我的订单类中,包什么也不返回?
我正在使用订单类中的包列表。
''' <remarks/>
<Serializable()> _
<XmlType("Order", AnonymousType:=True, NameSpace:="http://www.w3.org/1999/XMLSchema-instance")> _
Public Class Order
'other memebers first
.....
'nested packed class declaration
<XmlElement("Package", NameSpace:="http://www.w3.org/1999/XMLSchema-instance")> _
Public Property Packages() As List(Of Package)
Get
If _Packages Is Nothing Then
_Packages = New List(Of Package)
End If
Return _Packages
End Get
Set(ByVal value As List(Of Package))
_Packages = value
End Set
End Property
End Class
我的包类是这样装饰的。
<Serializable()> _
<XmlType("Package", AnonymousType:=True, NameSpace:="http://www.w3.org/1999/XMLSchema-instance"> _
Public Class Package
<XmlElementAttribute("OrderPackageType_ID", Form:=XmlSchemaForm.Unqualified, IsNullable:=True)> _
Public Property OrderPackageType_ID() As NullableInt
Get
Return _OrderPackageType_ID
End Get
Set(ByVal value As NullableInt)
_OrderPackageType_ID = value
End Set
End Property
....
End Class
packages 类可以很好地填充以下 XML。但是作为嵌套元素,和上面一样,它返回空?
<?xml version="1.0" encoding="utf-8"?>
<Packages>
<Package>
<OrderPackageType_ID xsi:type="xsd:int">1</OrderPackageType_ID>
<Title_ID xsi:type="xsd:int">1</Title_ID>
<StartIssue xsi:type="xsd:string">November 2010</StartIssue>
<EndIssue xsi:type="xsd:string" />
</Package>
<Package>
<OrderPackageType_ID xsi:type="xsd:int">2</OrderPackageType_ID>
<Title_ID xsi:type="xsd:int">1</Title_ID>
<StartIssue xsi:type="xsd:string">October 2010</StartIssue>
<EndIssue xsi:type="xsd:string" />
</Package>
</Packages>
任何帮助将不胜感激,希望我为您提供了足够的信息。
问候...
【问题讨论】:
标签: xml soap nested deserialization