2013-12-23 112 views
0

我在反序列化以下XML时遇到了一些麻烦。我可以将订单填充得很好,但嵌套的软件包给我带来了一段艰难的时光。在序列化之前清理消息是肥皂消息。我认为问题出在软件包标签中的XSI属性上?遇到麻烦反序列化消息

请注意:以下XML来自SOAP消息,它是从getSoapBody(string)函数返回的。所有其他(40左右)肥皂反应都很好,它只是我遇到问题的双重嵌套。

<?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> 

这deseiralizes的代码如下

 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 

包类用下面的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>  

任何帮助,将不胜感激,希望我提供足够的信息给你。

问候......

回答

0

我想我最好回答这个问题,我找到了答案前一阵子了。我需要正确装饰属性和类,类似于以下内容。这解决了我的问题。

<System.Xml.Serialization.XmlArrayAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)> _ 
<System.Xml.Serialization.XmlArrayItemAttribute("Package", GetType(Package), Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable:=True)> _ 
    Public Property Packages() As Package() 
     Get 
      Return _Packages 
     End Get 
     Set(ByVal value As Package()) 
      _Packages = value 
     End Set 
    End Property 
End Class 


<System.Xml.Serialization.XmlRoot("Package")> _ 
Public Class Package 
.... 
End Class