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,因为不支持搜索中的文字命名空间.
我想我会稍微拉皮条XOM。有点遗憾的是,XOM 作者决定不公开子节点等的集合,但与 Scala 相比,他们在 Java 中这样做的工作量更多,但优势却更少。(它是一个设计良好的库。)
编辑:毕竟我最终还是拉皮条了 JDOM,因为 XOM 不会提前编译 XPath 查询。由于这次我的大部分精力都集中在 XPath 上,因此我能够想出一个很好的模型来回避大多数泛型问题。提出方法getChildren
和getAttributes
的合理通用getAdditionalNamespaces
版本应该不会太难org.jdom.Element
(通过使用名称略有更改的新方法来拉皮条库。)我认为没有修复方法getContent
,而且我也没有确信getDescendants
。