我正在使用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”标签包含一个像hello这样的简单文本,它会按预期工作。
有什么想法吗? 谢谢。
答案 0 :(得分:1)
您遇到的问题是表格内容的HTML规范非常严格,因此您的未知标记会在表格之外得到培养。 (Jsoup这样做是为了匹配HTML规范,因此它尽可能地匹配浏览器行为。)
在这种情况下,您知道自己在做什么并且正在创建HTML,因此您可以将jsoup设置为忽略HTML规范,并在处理标记时处理它们。使用XML parser:
执行此操作Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser());
答案 1 :(得分: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是服务器端,请参阅下面的评论。