我已经在有关html解析的stackoverflow上阅读了很多问题。 我已经了解到,在可能的情况下,我们应该避免使用正则表达式并使用解析器。 我知道有很多Html / Xml解析器,但我不知道如何正确使用它们。
考虑这个html,通过jTidy解析。我有一个由此代码的jTidy创建的Document对象:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<!-- Header content -->
</head>
<body>
<div id="container">
<div id="id1"> ... </div>
<div id="id2"> ... </div>
<div id="mainContent">
<div id="section 1">
<div id="subSection">
<!-- Interested part -->
<tbody>
<tr class="success">
<td class="fileName"><span>File One</span></td>
</tr>
<tr class="fail">
<td class="fileName"><span>File Two</span></td>
</tr>
<tr class="success">
<td class="fileName"><span>File Three</span></td>
</tr>
</tbody>
</div>
</div>
</div>
</div>
</body>
现在,我想映射(在Map:D中)每个文件名及其类(成功/失败)。 我可以用DOM来做,但我应该创建一个NodeList,并为每个Element创建一个新的节点列表(大量内存和无聊)。有萨克斯,Xerces等替代品,但我不知道它们的优点/缺点。
从&#34; jTyded&#34;中提取这些信息的最简单(也是最快)的方法是什么?上面的HTML?
答案 0 :(得分:1)
尝试JSoup。
答案 1 :(得分:1)
首先 - 您忘记添加<table>
代码。
您可以使用 Jsoup
轻松解析代码以下是一个例子:
// String html =" ...here goes your html code... ";
// Document doc = Jsoup.parse(html);
// Or from file:
File input = new File("com.htm");
Document doc = Jsoup.parse(input, "UTF-8");
Elements trs = doc.select("tr"); //select all "tr" elements from document
for(Element tr:trs){
//Getting the class string form tr element
System.out.println("The file class is: " + tr.attr("class")
//getting the filename string that holds inside td element
+ " The filamee is: " + tr.select("td").text());
}
}
答案 2 :(得分:0)
在我看来,最好的方法是使用XSLT + XPath(正如Greg在评论中建议的那样),以便为unmarshaller生成输入。
所以整个流程如下所示: HTML-&gt; [jTidy purifying] - &gt; XHTL-&gt; [XSLT转换] - &gt;字符串数据表示 - &gt; [JAXB unmarshaller] - &gt; Java对象。
如果您不想生成对象,请使用此线程中描述的XPath:How to read XML using XPath in Java