【问题标题】:Jsoup match any element with a namespaceJsoup 匹配具有命名空间的任何元素
【发布时间】:2017-03-24 17:59:27
【问题描述】:

我想使用 Jsoup css 选择器返回具有特定命名空间的所有元素,例如 <server:cpu> <server:memory>

Document doc = Jsoup.parse("<server:cpu> <server:memory>");
Elements el = doc.select("sever|*");

但这会返回一个Could not parse query 异常

此文档https://jsoup.org/apidocs/org/jsoup/select/Selector.html 说您可以使用:

*|任何命名空间 ns 中的 E 类型的 E 元素

但我想做相反的事情:在命名空间 ns 中获取任何类型的元素。这可能吗?

编辑: 我不再收到异常,但是在执行 doc.select("sever|*"); 后我得到了一个空的 Elements 对象

【问题讨论】:

  • 我无法重现此问题。同样在引用的行下方,我们可以看到ns|E elements of type E in the namespace ns,这表明sever|* 应该可以工作。 BTW Jsoup.parse("file.xhtml"); 不会尝试查找和解析file.xhtml 文件,而是将"file.xhtml" 视为需要解析的原始数据。
  • 也许您使用的是旧版本的 Jsoup。它似乎正在处理1.10.11.10.2
  • @Pshemo "Jsoup.parse("file.xhtml");"只是一个例子。我会修复它以解决您的问题。然而,suggest server|* should work 并没有确认任何事情。我已经试过了,还是不行。
  • @Pshemo 我使用的是 1.10.2 版
  • 根据您的实际用例,可能的解决方案可能是创建您自己的迭代器,它将遍历所有节点并检查标签名称是否以server: 开头。如果是,则将此类元素/节点添加到包含此类元素的列表中。这是一个例子stackoverflow.com/a/23766900

标签: java css xml scala jsoup


【解决方案1】:

我在 Scala 中写了一些东西来完成与通配符 () 即 ("namespace|") 的命名空间匹配,因为 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建议的链接https://stackoverflow.com/a/23766900

感谢 @NaderHadjiGhanbari 帮助我理解 Java 集合并将其转换为 Scala 集合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 2013-02-18
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多