在Scala中执行复杂的XPath查询

Ken*_*oom 13 java xml xpath scala jdom

在scala中使用哪种最简单的API来对文档执行以下XPath查询?

//s:Annotation[@type='attitude']/s:Content/s:Parameter[@role='type' and not(text())]

//s:Annotation[s:Content/s:Parameter[@role='id' and not(text())]]/@type
Run Code Online (Sandbox Code Playgroud)

(s被定义为特定命名空间的昵称)

我在Scala的XML库上找到的唯一文档没有关于执行复杂的真实XPath查询的信息.

我曾经为此目的喜欢JDOM(在Java中),但由于JDOM不支持泛型,因此在Scala中使用会很痛苦.(Java的其他XML库在Java中往往更加痛苦,但我承认我不了解真实情况.)

Dan*_*ral 12

//s:Annotation[@type='attitude']/s:Content/s:Parameter[@role='type' and not(text())]
Run Code Online (Sandbox Code Playgroud)

好吧,我不明白这个s:符号,也无法在XPath规范中找到它.但是,忽略这将是这样的:

(
  (xml 
    \\ "Annotation" 
    filter (_ \ "@type" contains Text("x"))
  ) 
  \ "Content" 
  \ "Parameter" 
  filter (el => (el \ "@type" contains Text("type")) && el.isInstanceOf[Text])
)
Run Code Online (Sandbox Code Playgroud)

注意:由于优先级较高的括号的必要性\filter.我已将格式更改为多行表达式,因为Scala等效对于单行来说太冗长了.

但是我无法回答关于命名空间的问题.如果可能的话,不知道如何在搜索中使用它们.文档提到@{uri}attribute了前缀属性,并没有提到有关前缀元素的任何内容.另请注意,您需要传递一个解析为所需命名空间的URI,因为不支持搜索中的文字命名空间.

  • @Ken所有Java的库都可用......我认为没有更好的XPath支持是一种耻辱. (4认同)

Ken*_*oom 3

我想我会稍微拉皮条XOM。有点遗憾的是,XOM 作者决定不公开子节点等的集合,但与 Scala 相比,他们在 Java 中这样做的工作量更多,但优势却更少。(它是一个设计良好的库。)

编辑:毕竟我最终还是拉皮条了 JDOM,因为 XOM 不会提前编译 XPath 查询。由于这次我的大部分精力都集中在 XPath 上,因此我能够想出一个很好的模型来回避大多数泛型问题。提出方法getChildrengetAttributes的合理通用getAdditionalNamespaces版本应该不会太难org.jdom.Element(通过使用名称略有更改的新方法来拉皮条库。)我认为没有修复方法getContent,而且我也没有确信getDescendants