2016-10-24 52 views
0

我需要反序列化包含具有兩種不同類型的元素的XML文件。
實施例:反序列化具有不同xsi:樣式的元素

<XmlElement("loop")> Public prLoop() As PosResponseLoop 

第二個定義爲::

<XmlInclude(GetType(loopTerminatedType))> _ 
Public Class PosResponseLoop 

第一個可以以類似的定義

<loop xsi:type="loopDynamicLengthType"> 
... 
<loop xsi:type="loopTerminatedType"> 
... 

以我源作爲類被定義方式和名稱,

<XmlInclude(GetType(loopDynamicLengthType))> _ 
Public Class PosResponseLoop 

但是編譯器說:

class 'PosResponseLoop' and class 'PosResponseLoop' conflict in namespace 'WindowsApplication1'. 

我該如何解決呢?

回答

1

標準屬性xsi:type允許XML元素顯式聲明其類型。在這種情況下,元素<loop>可以有兩種類型,loopDynamicLengthTypeloopTerminatedType。如解釋here,XmlSerializer使用xsi:type信息將XML元素映射到特定的.Net類型。因此,你需要做的是有一個單獨的基類(可能但不一定是抽象的)來表示任何可能的類型的循環,有兩個子類,分別對應兩種可能xsi:type值:

<XmlInclude(GetType(LoopTerminatedType))> _ 
<XmlInclude(GetType(LoopDynamicLengthType))> _ 
Public MustInherit Class PosResponseLoop 
End Class 

<XmlType("loopTerminatedType")> _ 
Public Class LoopTerminatedType 
    Inherits PosResponseLoop 
End Class 

<XmlType("loopDynamicLengthType")> _ 
Public Class LoopDynamicLengthType 
    Inherits PosResponseLoop 
End Class 

<XmlInclude>屬性在基類上指定可能遇到的可能子類型的集合。派生類中的<XmlType(String)>屬性指定將顯示爲相應xsi:type屬性的值的名稱。

然後你包含類型應該是這樣的:

Public Class RootObject 
    <XmlElement("loop")> Public prLoop() As PosResponseLoop 
End Class 

樣品fiddle

相關問題