【问题标题】:Parsing complicated XML using Jsoup使用 Jsoup 解析复杂的 XML
【发布时间】:2019-06-19 16:22:49
【问题描述】:

我正在尝试使用 Jsoup 解析 XML 格式的文档,特别是下面示例代码中段落标记中的内容。

...
<nitf:body.content>
     <p> Content would be here. </p>
</nitf:body.content>
...

文档中有多个段落标签。因此,我选择使用选择器语法进入 body.content 标签,然后是它下面的段落标签。我正在尝试但未能立即获得它:

// epochFileDoc is the name of the document with the code shown above.
Element tag_element = epochFileDoc.selectFirst("nitf|body.content > p");

我尝试了几种不同的选择器语法组合,包括“nitf|content.body > p”和“nitf|body > p”。我试过的都没有。

如何在 Jsoup 中使用 selector-syntax 来获取上面显示的段落标签?

编辑:我明白为什么 content.body 在选择器语法中不起作用,因为它在标签中搜索 nitf:content="body" ,但我仍然不知道如何获取该元素。

【问题讨论】:

  • 你可以使用不同的 XML 解析器,例如:一个基于 en.wikipedia.org/wiki/Document_Object_Modelen.wikipedia.org/wiki/XPath 的解析器,而不是只支持 CSS 选择器的解析器?点在 CSS 中具有特殊含义。
  • 如果可以的话,我会遵循这个建议;我需要为这个软件使用 Jsoup。我为这个问题创建了一个解决方法,我将在稍后发布,因为点具有特殊含义(就像你说的那样)。

标签: jsoup


【解决方案1】:

@dacmacho 的解释是正确的,如果您可以在解析数据之前修改数据,解决方法就可以了。

现在有一个侵入性较小的解决方案:我刚刚向 JSoup 推送了一个拉取请求 (https://github.com/jhy/jsoup/pull/1442),允许在选择器中使用转义反斜杠 用于元素名称和 CSS-标识符。

因此,通过这种更改,您只需使用(注意点前的反斜杠):

Element tag_element = epochFileDoc.selectFirst("nitf|body\.content > p");

【讨论】:

    【解决方案2】:

    之所以不能像 Jsoup 那样使用 CSS 选择器进行选择,是因为点在 CSS 中具有特殊含义(就像 @Shlomi Fish 所说的那样)。 在我的代码中,我使用下面的行将 nitf:body.content 的实例替换为 nitf:body-content,其中 file 是存储 XML 的字符串:

    file = file.replace("<nitf:body.", "<nitf:body-");
    

    这使我可以使用以下方法选择元素:

    Element tag_element = epochFileDoc.selectFirst("nitf|body-content > p");
    

    在这种情况下,为 XML 格式的代码使用不同的解析器会更聪明,但如果您有像我这样的要求/想要保留 Jsoup,这种解决方法可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2013-01-17
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多