2013-02-09 94 views
0
我使用Jsoup解析包含需要一些逻辑运算的结果

Jsoup解析器问题

一些像这样的自定义标签简短的HTML文档

<table><showif field="xxx"><tr><td>test</test></td></tr></showif><tr><td>xyz</td></tr></table> 

Document doc = Jsoup.parse(html); 
Elements showif_fields = doc.select("SHOWIF[field]"); 

在这种情况下,内部的内容似乎丢失,outerHtml()方法仅显示了这一点:

<showif value="xxx"></showif> 

但如果“showif”标签包含一个简单的文本一样招呼,它按预期工作。

任何想法? 谢谢。

回答

1

您碰到的问题是表格内容的HTML规范非常严格,所以您的未知标签会在表格外进行培育。 (Jsoup这样做是为了匹配HTML规范,以便它尽可能与浏览器行为相匹配。)

在这种情况下,您知道自己在做什么并且正在创建HTML,因此您可以设置jsoup忽略HTML规范,只是在它看到它们时处理标签。与XML parser做到这一点:

Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser()); 
+0

谢谢乔纳森,它的工作原理! – 2013-02-22 22:55:07

0

问题是,Jsoup已经“消毒”了你的HTML。作为一个快速测试,我贴你的HTML到一个页面,用我的浏览器(这往往不是消毒吧)查看它,它告诉我的HTML实际上看起来像:

<showif value="xxx"/> 
<table><tbody><tr><td>test</td></tr><tr><td>xyz</td></tr></tbody></table> 

这是因为只有少数几个元素允许直接在<table>之内,并且浏览器认为你在​​内部放置了一个<showif>标签,并且为你解决了这个问题。我认为Jsoup做了类似的事情。

编辑:有Jsoup现在正在运行,而事实上它创建了一个类似的输出,如果我看doc.outerHtml()

如果你真的需要使用非标准的东西来诠释您的网页,你可能有更好的运气非标准的属性,如:

<table> 
    <tr showif="xxx"><td>test</test></td></tr> 
    <tr><td>xyz</td></tr> 
</table> 

那么你可以说:Elements showif_fields = doc.select("*[showif]");。这产生了

<tr showif="xxx"> 
    <td>test</td> 
</tr> 

作为showif_fields.outerHtml()

然后,您可能会采用不同的方法,例如, JavaScript模板引擎,如jQuery模板或Mustache(以及许多其他模板引擎),它们在执行一些逻辑之后插入生成的HTML,而不是将内容加载到页面上并在之后进行修复。这当然取决于你的要求,我不知道这个建议是否合理。 编辑:不,它没有任何意义,因为Jsoup是服务器端,请参阅下面的注释。

+0

谢谢克莱门斯的回答,但在这一点上没有浏览器可言,我们的目标是呈现在浏览器中的“消毒”的HTML。这个值直接在Jsoup解析器中传递,并且解析器“自我清理”它,重建“错误”的树,我想这与它处理未知标记有关。记录中我需要它在一个Android应用程序。 – 2013-02-10 07:51:01

+0

啊,愚蠢的我,我没有检查,并假设J来自JavaScript,而不是Java。由于事情是服务器端,那么我的“不同的方法”段完全没有意义。但是我看到Jsoup试图净化html本身,所以也许会出现这个问题。我已经相应地更新了我的答案。 – 2013-02-10 07:58:33