【问题标题】:Deserialize XSD and read key value反序列化 XSD 并读取键值
【发布时间】:2018-10-01 09:27:57
【问题描述】:

此 XML 架构是使用在线工具生成的,该工具从 .xml 提供 .xsd 架构

我有如下所示的 XML 架构:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="snapshot">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="device" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="property" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="value" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="value" type="xs:string" />
                        <xs:attribute name="units" type="xs:string" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:string" />
                  <xs:attribute name="module" type="xs:string" />
                  <xs:attribute name="type" type="xs:string" />
                  <xs:attribute name="category" type="xs:string" />
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string" />
            <xs:attribute name="capabilities" type="xs:string" />
            <xs:attribute name="name" type="xs:string" />
            <xs:attribute name="hwlocator" type="xs:string" />
            <xs:attribute name="oslocator" type="xs:string" />
            <xs:attribute name="ModelUID" type="xs:string" />
            <xs:attribute name="DeviceUID" type="xs:string" />
            <xs:attribute name="LocationUID" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="datetime" type="xs:string" />
      <xs:attribute name="locale" type="xs:string" />
      <xs:attribute name="version" type="xs:string" />
    </xs:complexType>
  </xs:element>
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="snapshot" />
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

我做的下一步是生成如下所示的 vb 类:

使用命令行:xsd.exe path.xsd /classes /language:vb /out:output '

Option Strict Off
Option Explicit On

Imports System.Xml.Serialization

'
'This source code was auto-generated by xsd, Version=2.0.50727.3038.
'

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true),  _
 System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=false)>  _
Partial Public Class snapshot

    Private deviceField() As snapshotDevice

    Private datetimeField As String

    Private localeField As String

    Private versionField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("device", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property device() As snapshotDevice()
        Get
            Return Me.deviceField
        End Get
        Set
            Me.deviceField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property datetime() As String
        Get
            Return Me.datetimeField
        End Get
        Set
            Me.datetimeField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property locale() As String
        Get
            Return Me.localeField
        End Get
        Set
            Me.localeField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property version() As String
        Get
            Return Me.versionField
        End Get
        Set
            Me.versionField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class snapshotDevice

    Private propertyField() As snapshotDeviceProperty

    Private typeField As String

    Private capabilitiesField As String

    Private nameField As String

    Private hwlocatorField As String

    Private oslocatorField As String

    Private modelUIDField As String

    Private deviceUIDField As String

    Private locationUIDField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("property", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property [property]() As snapshotDeviceProperty()
        Get
            Return Me.propertyField
        End Get
        Set
            Me.propertyField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property type() As String
        Get
            Return Me.typeField
        End Get
        Set
            Me.typeField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property capabilities() As String
        Get
            Return Me.capabilitiesField
        End Get
        Set
            Me.capabilitiesField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property name() As String
        Get
            Return Me.nameField
        End Get
        Set
            Me.nameField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property hwlocator() As String
        Get
            Return Me.hwlocatorField
        End Get
        Set
            Me.hwlocatorField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property oslocator() As String
        Get
            Return Me.oslocatorField
        End Get
        Set
            Me.oslocatorField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property ModelUID() As String
        Get
            Return Me.modelUIDField
        End Get
        Set
            Me.modelUIDField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property DeviceUID() As String
        Get
            Return Me.deviceUIDField
        End Get
        Set
            Me.deviceUIDField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property LocationUID() As String
        Get
            Return Me.locationUIDField
        End Get
        Set
            Me.locationUIDField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class snapshotDeviceProperty

    Private valueField() As snapshotDevicePropertyValue

    Private keyField As String

    Private moduleField As String

    Private typeField As String

    Private categoryField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("value", Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)>  _
    Public Property value() As snapshotDevicePropertyValue()
        Get
            Return Me.valueField
        End Get
        Set
            Me.valueField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property key() As String
        Get
            Return Me.keyField
        End Get
        Set
            Me.keyField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property [module]() As String
        Get
            Return Me.moduleField
        End Get
        Set
            Me.moduleField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property type() As String
        Get
            Return Me.typeField
        End Get
        Set
            Me.typeField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property category() As String
        Get
            Return Me.categoryField
        End Get
        Set
            Me.categoryField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true)>  _
Partial Public Class snapshotDevicePropertyValue

    Private valueField As String

    Private unitsField As String

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property value() As String
        Get
            Return Me.valueField
        End Get
        Set
            Me.valueField = value
        End Set
    End Property

    '''<remarks/>
    <System.Xml.Serialization.XmlAttributeAttribute()>  _
    Public Property units() As String
        Get
            Return Me.unitsField
        End Get
        Set
            Me.unitsField = value
        End Set
    End Property
End Class

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038"),  _
 System.SerializableAttribute(),  _
 System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.ComponentModel.DesignerCategoryAttribute("code"),  _
 System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true),  _
 System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=false)>  _
Partial Public Class NewDataSet

    Private itemsField() As snapshot

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute("snapshot")>  _
    Public Property Items() As snapshot()
        Get
            Return Me.itemsField
        End Get
        Set
            Me.itemsField = value
        End Set
    End Property
End Class

现在我该如何反序列化这个对象:使用这样的代码

Dim serializer As New XmlSerializer(GetType(List(Of snapshot)), New XmlRootAttribute("snapshotDevice"))
Dim deserialized As List(Of snapshot) = Nothing
Using file = System.IO.File.OpenRead(XMLFile)
    deserialized = DirectCast(serializer.Deserialize(file), List(Of snapshot))
End Using

我的对象什么都不返回,即我想读取这个选定的值

【问题讨论】:

    标签: xml vb.net xsd


    【解决方案1】:

    其中一种解决方案是使用DataSet.ReadXML

    Dim dsPubs As New DataSet()
    
    dsPubs.ReadXml("path.xml", XmlReadMode.Auto)
    
    Dim dtKeys As DataTable = New DataView(dsPubs.Tables(2)).ToTable
    Dim dtValues As DataTable = New DataView(dsPubs.Tables(3)).ToTable
    
    Dim tbPairs As New DataTable
    ' Define columns
    tbPairs.Columns.Add("ATTRIBUTE", GetType(System.String))
    tbPairs.Columns.Add("ATTRIBUTE_DESC", GetType(System.String))
    
    For I = 0 To dtKeys.Rows.Count - 1
        tbPairs.Rows.Add(dtKeys.Rows(I).Item(1).ToString, dtValues.Rows(I).Item(0).ToString)
    Next
    
    DataGridView1.DataSource = tbPairs
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多