【问题标题】:How to use XMLReader in TagHandler.handleTag(...)如何在 TagHandler.handleTag(...) 中使用 XMLReader
【发布时间】:2012-08-05 14:40:11
【问题描述】:

我正在尝试将列表(<ul><ol>)添加到 TextView。通常您使用

将 HTML 加载到 TextView
textview.setText(Html.fromHtml("some String with HTML in it"));

但这不适用于所有 HTML 标签。您可以通过覆盖默认TagHandler 并使用

来扩展对不同标签的支持
textview.setText(Html.fromHtml("some String with HTML in it", null, new MyTagHandler()));

问题是:android.text.Html.TagHandler.handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) 中的 xmlReader 包含什么?是否有可能以某种方式使用

if (tag.equals("ul")) {
  // some call to xmlReader
}

是的,我已经看到了以下主题。我只是在寻找替代解决方案。

【问题讨论】:

    标签: android html textview xmlreader


    【解决方案1】:

    XMLReader其实只是一个接口,它定义的方法可以从API documentation读取。

    用于处理Html 类中的SAX 事件的ContentHandler 称为Html.HtmlToSpannedConverter,而后者又使用其私有handleStartTag(String,Attributes) 方法来处理HTML 元素的起始标签。因此,开箱即用支持的元素列表似乎是 br, p, div, em, b, strong, cite, dfn, i, big, small, font, blockquote, tt, a, u, sup,子,h1...h6 和 img。最后,如果标签未被识别,则使用作为 HtmlToSpannedConverter 参数的TagHandler,如果它不为空。

    SAX 处理程序的想法是您只能从中获取事件:这是一个开始标记,这是一个 CDATA 块,这是一个结束标记,等等。处理 XML 文档的另一种方法是使用 @987654327 @ 来创建它的 Document 对象。 SAX 解析器在您可能有一个可能不适合内存的大输入流时使用,当您需要快速解析文档时,或者当您从某个地方接收数据并希望在收到数据之前即时解析它所有的。因此,当使用 SAX 处理程序时,不可能在 XML 流中来回跳转。因此,总结一下您的问题“是否有可能获取<ul> 的所有<li> 数据”的答案:不,很遗憾没有。

    在您的 TagHandler 中,您可能希望在遇到开始的“ul”标签时发出换行符,然后在输入开始的“li”标签时发出“•”,并在遇到结束的“li”时再次发出换行符或“ul”标签。

    如果您需要支持嵌套列表,您可以在 TagHandler 中添加一个计数器,以便每次遇到打开的“ul”时它都会增加,遇到关闭的“ul”时会减少。然后,您可以根据嵌套列表的计数器为项目符号添加不同数量的缩进。

    另一种方法是通过在遇到开始标签时添加一个元素并在遇到结束标签时删除它来创建一个元素堆栈。通过遍历堆栈,可以很容易地计算任何给定时间的祖先“ul”元素的数量。

    【讨论】:

    • 所以基本上 XMLReader 就在那里,但你从来没有在任何地方调用它?
    • 好吧,我又看了一遍,似乎internallyHtml 类使用org.ccil.cowan.tagsoup.Parser 类的实例初始化了XMLReader。毕竟,如果你想阅读你的 XML,你确实需要一个 XMLReader。 :) 不过,只有 XMLReader 的 setContentHandler(ContentHandler)parse(InputSource) 方法被调用。
    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 2010-10-28
    • 2014-03-20
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多