我在我的应用程序中使用jericho解析器来获得网页的轻量级版本,从中提取一些部分。例如,当我得到这段代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN/" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> </head> <body> <b> <span class="articletitletext">Happy New Year!</span></b> <br> <span class="postedstamp">Posted By <script language="JavaScript" type="text/javascript"> <!-- document.write('<a href=" mailto:chris.wyman@verizon.net">'); // --> </script>Chris</a> on January 1, 2012</span><br> <br> <span id="intelliTXT">
From all of us here at TheForce.net, we wish you and your family a safe and Happy New Year. May the Force be with you in 2012!
</span></body> </html>
我想再次使用jericho解析器解析它,但是当我运行
时ArrayList<Element> centerElems=(ArrayList<Element>) pageSource.getAllElements(HTMLElementName.CENTER);
我得到了这个异常
01-01 10:46:37.518: ERROR/AndroidRuntime(648): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.test.theforce/net.test.theforce.NewsListActivity}: java.lang.RuntimeException: java.lang.ClassCastException: java.util.Collections$EmptyList
和应用程序崩溃…那么,浅色页有什么问题?
在我看来,Jericho解析器可以解析您提供给它的HTML。您得到的错误是因为您对getAllElements()
方法返回的内容做出了错误的假设。
我承认我只能找到这个方法的零参数重载的Javadoc,而不是您正在使用的单参数重载,所以我必须假设两个方法返回相同的类型List<Element>
。在您的示例中,HTML中没有center
元素,因此getAllElements()
方法应该返回一个空的List<Element>
。这里不需要返回ArrayList<Element>
;List<Element>
的任何实现都可以。在本例中,它选择返回一个Collections.emptyList()
。这不是ArrayList<Element>
,你得到的是ClassCastException
,因为你不能将它强制转换为ArrayList<Element>
。
在我看来,你有两个选择:
-
首先,您可能不需要返回的列表是
行ArrayList<Element>
。使用List<Element>
可能就足够了。在本例中,您应该替换ArrayList<Element> centerElems=(ArrayList<Element>) pageSource.getAllElements(HTMLElementName.CENTER);
List<Element> centerElems = pageSource.getAllElements(HTMLElementName.CENTER);
-
其次,如果您确实需要列表是
ArrayList<Element>
,那么您可以从结果中创建ArrayList<Element>
:ArrayList<Element> centerElems = new ArrayList<Element>(pageSource.getAllElements(HTMLElementName.CENTER));