【问题标题】:How to deserialize an html div when it has certain attributes to it?当它具有某些属性时如何反序列化html div?
【发布时间】:2012-10-08 05:55:02
【问题描述】:

例如:

<div class="link_text">
 <a href="http://www.stackoverflow.com">
 <strong>Text</strong></a>
</div>

使用像 XML 这样的普通标签很容易,您只需创建与标签同名的类,所以如果标签是:

<something></something>

您创建了一个名为 something 的类,但是您将如何在 HTML 中的示例 div 中执行此操作,例如该 div,其中包含类属性?

【问题讨论】:

    标签: vb.net serialization deserialization


    【解决方案1】:

    您需要将XmlAttribute 属性应用于类中的属性,以表明您希望将属性视为属性而不是元素。例如:

    Public Class div
        <XmlAttribute()> _
        Public Property [class] As String
            Get
                Return _class
            End Get
            Set(value As String)
                _class = value
            End Set
        End Property
        Private _class As String
    
        Public Property a As a
            Get
                Return _a
            End Get
            Set(value As a)
                _a = value
            End Set
        End Property
        Private _a As a
    
        Public Property strong As String
            Get
                Return _strong
            End Get
            Set(value As String)
                _strong = value
            End Set
        End Property
        Private _strong As String
    End Class
    
    Public Class a
        <XmlAttribute()> _
        Public Property href As String
            Get
                Return _href
            End Get
            Set(value As String)
                _href = value
            End Set
        End Property
        Private _href As String
    End Class
    

    通常您不需要在属性名称周围加上方括号,就像在 class 属性上一样。在此示例中必须这样做的唯一原因是“类”一词是 VB.NET 语言中的一个特殊关键字。方括号强制 VB 将其视为标识符名称,而不是关键字的典型含义。不带括号的另一种方法是将属性命名为不同的名称,然后强制它在 XML 中具有名称“类”:

    Public Class div
        <XmlAttribute("class")> _
        Public Property MyClassAttribute As String
            ' ...
        End Property
    End Class
    

    无论如何,一旦将其反序列化为div 对象,您就可以这样读取它:

    Dim myDiv As div = '...
    Dim theClassOfMyDiv As String = myDiv.class
    Dim theHref As String = myDiv.a.href
    ' etc.
    

    【讨论】:

    • 先生。 Doggart再次出击!顺便说一下,我把问题名称弄乱了,应该说反序列化而不是 fixed。所以我正在寻找的是如何将该 div 的元素转换为我可以阅读的数据,就像我之前的问题一样.. :) 我正在开发这个将显示天气预报的网络应用程序,所以我一直在尝试从互联网上收集数据来做到这一点。
    • 我添加了一个更完整的示例来说明我的意思。但是,我认为您更大的困惑可能来自您走错了路。如果您的目标是解析 HTML,我不建议使用 XML 反序列化来完成它。首先,很多 HTML 不符合格式良好的 XML 文档的要求。然而,即使它可以反序列化并不意味着它很容易。尝试构建数据结构来模仿 HTML 文档似乎是一种过于复杂的方法,尤其是当您只对文档中的一小部分元素感兴趣时。
    • 对于解析 HTML,我强烈建议您查看 HtmlAgility 包,它是一个第三方库(我相信是免费的、开源的)。这样,您可以将文档加载到标准 DOM 对象中,然后轻松地遍历文档树或使用 XPATH 从其中查询数据。它的工作原理与XmlDocument 类非常相似。
    • 感谢 Steven 的提醒,我一定会尽快调查,这件事有 2 个来源,1 是 Weather Underground,我可以使用它的 API 来请求 XML 文件我已经反序列化了,另一个来源是天气频道,他们确实在他们的网站上提供了我需要的那种数据的一个小峰值,但不要在他们的 API 上这样做,因此我试图尝试反序列化部分的 html 但我想你比我有更多的知识。如果我有更多麻烦,我可能会告诉你。 :)
    • 反序列化是一种非常有用的读取 XML 的方法。这很好,因为在简单的情况下,它可以使代码更易于阅读和维护。但是,对于大型复杂文档,最终可能会使代码变得不那么直观。听起来解析 Html 已经达到了序列化弊大于利的复杂程度。一旦你看到 XPATH 是多么简单和直观,你甚至可以考虑将它用于 Html 和 Xml。
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多