【问题标题】:What's the easiest way in VB.NET to parse this XML into objects?VB.NET 中将此 XML 解析为对象的最简单方法是什么?
【发布时间】:2009-09-29 05:08:46
【问题描述】:

在 VB.NET 中解析此 XML 的最简单方法是什么?

以下是完整源代码的示例:

View Source XML

我相信可以将 XML 直接读入与 XML 的结构相匹配的类结构中。

让我们从上面的例子中提取一些 XML,

  <?xml version="1.0" encoding="UTF-8" ?> 
- <kml xmlns="http://earth.google.com/kml/2.0">
- <Response>
  <name>1321 herbert street, Warren, MI</name> 
  <Status>X</Status> 
  </Response>
  </kml>

我想我可以使用这个取自另一个 SO 帖子的代码将 XML 转换为相应的对象

Imports System.IO
Imports System.Text

Public Class Xml

    Public Shared Function SerializeToXMLString(ByVal ObjectToSerialize As Object) As String
        Dim mem As MemoryStream = New MemoryStream()
        Dim ser As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(ObjectToSerialize.GetType())
        ser.Serialize(mem, ObjectToSerialize)
        Dim ascii As ASCIIEncoding = New ASCIIEncoding()
        Return ascii.GetString(mem.ToArray())
    End Function

    Public Shared Function DeSerializeFromXMLString(ByVal TypeToDeserialize As System.Type, ByVal xmlString As String) As Object
        Dim bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(xmlString)
        Dim mem As MemoryStream = New MemoryStream(bytes)
        Dim ser As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(TypeToDeserialize)
        Return ser.Deserialize(mem)
    End Function

End Class

..但问题是,我到底该如何定义这些对象——即使对于缩小的简单示例也是如此?

例如,kml 部分令人困惑..

我从这门课开始...

Public Class kml

    Public Class Response


        Public Name As String
        Public Status As String

    End Class

End Class

..但是我运行这段代码:

Dim kml As kml
kml = CType(Xml.DeSerializeFromXMLString(GetType(kml), XmlDoc.OuterXml), kml)

..我得到一个解析错误。

我也试过这个:

Public Class kml

    Private _Response As New Response

    Public ReadOnly Property Response() As Response
        Get
            Return _Response
        End Get
    End Property

End Class

Public Class Response


    Public name As String
    Public Status As String

End Class

我知道我可能离这儿很远。有人请把我推向正确的方向......

谢谢

跟进问题。

如何处理嵌套集合,例如本例中的 Placemark 集合?

【问题讨论】:

    标签: xml vb.net web-services


    【解决方案1】:

    您的 kml 和 Response 类应如下所示:

      Public Class kml
            Private _Response As Response
            Public Property Response() As Response
                Get
                    Return _Response
                End Get
                Set(ByVal value As Response)
                    _Response = value
                End Set
            End Property
        End Class
        Public Class Response
            Private _name As String
            Public Property name() As String
                Get
                    Return _name
                End Get
                Set(ByVal value As String)
                    _name = value
                End Set
            End Property
            Private _Status As String
            Public Property Status() As String
                Get
                    Return _Status
                End Get
                Set(ByVal value As String)
                    _Status = value
                End Set
            End Property
        End Class
    

    然后你可以像这样反序列化:

    Dim serializer As New XmlSerializer(GetType(kml), "http://earth.google.com/kml/2.0")               
    Dim result As kml = TryCast(serializer.Deserialize(mem), kml)
    

    【讨论】:

    • 谢谢。有效。现在让我们看看我是否可以在它的基础上构建整个该死的 XML 文件。感谢您的帮助
    【解决方案2】:

    去掉Class Response,使用GetType(kml)。

    基本上,您不需要嵌套类(尽管您可以使用它们)。嵌套元素表示为properties,名称对应元素名称;如果属性本身是类类型,它可以有更多的嵌套元素(依次映射到该类的属性)。类名本身很重要的唯一情况是根元素。

    【讨论】:

    • 在阅读了您的评论(我试图消化)之后,我注意到我的嵌套类没有按正确的顺序定义后,我稍微修改了我的代码。还是运气好。重新阅读您的评论(再次)...
    猜你喜欢
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2011-02-08
    相关资源
    最近更新 更多