Java Jsoup将任何元素与命名空间匹配
我想使用Jsoup css选择器返回具有特定名称空间的所有元素,例如Java Jsoup将任何元素与命名空间匹配,java,css,xml,scala,jsoup,Java,Css,Xml,Scala,Jsoup,我想使用Jsoup css选择器返回具有特定名称空间的所有元素,例如 Document doc = Jsoup.parse("<server:cpu> <server:memory>"); Elements el = doc.select("sever|*"); documentdoc=Jsoup.parse(“”); 元素el=doc.select(“sever |*”); 但返回的无法解析查询异常 本文档说明您可以使用: *|在任何名称空间ns中都有E类型的元素
Document doc = Jsoup.parse("<server:cpu> <server:memory>");
Elements el = doc.select("sever|*");
documentdoc=Jsoup.parse(“”);
元素el=doc.select(“sever |*”);
但返回的无法解析查询
异常
本文档说明您可以使用:
*|在任何名称空间ns中都有E类型的元素
但我想做的正好相反:在名称空间ns中获取任何类型的元素。这可能吗
编辑:
我不再得到异常,但是在执行
doc.select(“sever |*”)之后,我得到了一个空元素对象代码>我在Scala中编写了一些东西来完成与通配符()的名称空间匹配,即(“名称空间|”),因为JSoup版本1.10.2不支持它
def getElementsByNamespace(element: org.jsoup.nodes.Element, namespace: String): org.jsoup.select.Elements = {
import collection.JavaConverters._
val elements = element.select("*").asScala.filter(_.tagName().startsWith(s"$namespace:"))
new Elements(elements.asJava)
}
有关java版本,请参考@Pshemo建议的链接
感谢@naderhajighanbari帮助我理解Java集合并将其转换为Scala集合,我无法重现这个问题。同样在引号中的一行下面,我们可以看到名称空间ns
中类型E的ns | E元素,这表明sever*
应该可以工作。顺便说一句,Jsoup.parse(“file.xhtml”)
不会尝试查找和解析file.xhtml
文件,但会将file.xhtml
视为需要解析的原始数据。可能您使用的是较旧版本的Jsoup。它似乎正在处理1.10.1
和1.10.2
@Pshemo“Jsoup.parse(“file.xhtml”);”只是一个例子。我会解决你的问题。然而,说“建议服务器应该工作”并不能证实任何事情。我已经试过了,但它不起作用。@Pshemo我使用的是1.10.2版,以您的实际用例为基础。可能的解决方案是使用您自己的迭代器,该迭代器将遍历所有节点,并检查标记的名称是否以服务器:
开头。如果是,则将该元素/节点添加到包含该元素的列表中。这里有一个例子。