Mr *_*ubs 6 .net xml vb.net serialization
我称第三方Web服务返回大量XML数据(大约2mb),我想以比正常更受控制的方式将其反序列化为对象.这是xml:
<vehicle>
<vehicleManufacturer>
<type>1</type>
<name>A Make</name>
</vehicleManufacturer>
...
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用下面的代码来控制哪些元素被序列化到哪些属性,在这种情况下,Car Make对象包含两个属性,类型和名称.
<System.Xml.Serialization.XmlElement("vehicleManufacturer")> _
Public Property Make() As CarMake
Run Code Online (Sandbox Code Playgroud)
但是,如果可能的话,我希望能够将名称字段反序列化为Make属性,或者甚至将整个元素及其内容序列化为文本.
<System.Xml.Serialization.XmlElement("vehicleManufacturer")> _
Public Property Make() As String
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的例子,所以如果有任何资源可以帮助我,那就太棒了.
另一个例子:
<vehicle>
<warrantyDetail>
<warrantyBasicInformation buildStartdate="09/07/2013" warrantyStartDate="31/07/2013"/>
</warrantyDetail>
</vehicle>
Run Code Online (Sandbox Code Playgroud)
我想从warrantyBasicInformation中获取属性,而无需构建保修详细信息和warrantyBasicInformation对象.
请注意,这种事情通常是从WSDL生成的,但是,我不会提供一个,我没有XSD,并且尝试生成一个失败.我也知道我可以实现ISerializable并使用xml阅读器或linq,但同样,这可能会变成很多代码,也许很难维护.
我有一种感觉,这是一种代码味道,但这是我想出的最简单的方法。(它假设节点将存在等,在这种情况下是可以的。)
Using tr As IO.TextReader = New IO.StringReader(strResult)
Using reader As System.Xml.XmlReader = System.Xml.XmlReader.Create(tr)
reader.MoveToContent()
While reader.Read
If reader.NodeType = Xml.XmlNodeType.Element Then
Select Case reader.Name
Case "warrantyDetail"
Dim xel As XElement = CType(XNode.ReadFrom(reader), Xml.Linq.XElement)
If xel IsNot Nothing Then
vi.RegCountry = xel.Element("country").Element("name").Value
vi.Reg = xel.Element("registration").Value
xel.Element("warrantyBasicInformation").Attribute("buildStartdate").Value
xel.Element("warrantyBasicInformation").Attribute("buildStartdate").Value
...
End If
Case ...
End Select
End If
End While
End Using
End Using
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |