如何在TagHandler.handleTag(...)中使用XMLReader

时间:2012-08-08 13:14:06

标签: android html textview xmlreader

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

将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包含什么?是否可以使用

获取<li>的所有<ul>数据(或通常包含其内容的任何元素)
if (tag.equals("ul")) {
  // some call to xmlReader
}

是的,我已经看过那些跟随线程了。我只是在寻找替代解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

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

在你的TagHandler中,你可能想要在遇到一个开头的“ul”标签时发出一个换行符,然后在你输入一个开头的“li”标签时发出一个“•”,当你遇到一个结束的“li”时再次发生换行符或“ul”标签。

如果需要支持嵌套列表,可以在TagHandler中添加一个计数器,使其在每次遇到开头“ul”时递增,在遇到结束“ul”时递减。然后,您可以根据嵌套列表的计数器为项目符号添加不同数量的缩进。

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