0

我正在使用 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,它会按预期工作。

有任何想法吗?谢谢你。

4

2 回答 2

2

您遇到的问题是表格内容的 HTML 规范非常严格,因此您的未知标签正在表格之外培养。(Jsoup 这样做是为了匹配 HTML 规范,以便它尽可能地匹配浏览器行为。)

在这种情况下,您知道自己在做什么并且正在创建 HTML,因此您可以将 jsoup 设置为忽略 HTML 规范,只处理它看到的标签。使用XML 解析器执行此操作:

Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser());
于 2013-02-17T20:03:03.467 回答
0

问题是 Jsoup 已经“清理”了您的 HTML。作为一个快速测试,我将您的 HTML 粘贴到一个页面中并使用我的浏览器(也倾向于对其进行清理)查看它,它告诉我 HTML 实际上看起来像:

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

那是因为只有少数元素可以直接放在 a<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().

然后你可能会更好地使用不同的方法,例如像 jQuery 模板或 Mustache(以及许多其他)这样的 javascript 模板引擎,它在执行一些逻辑后插入生成的 HTML,而不是在页面上加载内容并修复它们然后。这当然取决于您的要求,我对这些要求还不够了解,无法判断此建议是否有意义。编辑:不,这没有意义,因为 Jsoup 是服务器端,请参阅下面的评论。

于 2013-02-10T00:46:54.727 回答