【问题标题】:Xpath compile Regex not showing xml commentsXpath编译正则表达式不显示xml注释
【发布时间】:2020-05-02 09:19:24
【问题描述】:

嘿,我对正则表达式的东西很糟糕,想知道这个 //[not(*)] 在放入 XML XPath 编译时究竟意味着什么?我唯一能找到的是 (https://regex101.com/r/Kjodlj/1)

匹配单个字符 [not(*)]。

not() 匹配单个字符 not()(区分大小写)

NodeList nodeList = (NodeList) xPath.compile("//*[not(*)]").evaluate(document, XPathConstants.NODESET);

上面的代码似乎没有给我整个 XML 文件中的任何 cmets。做这样的事情:

NodeList nodeList = (NodeList) xPath.compile("//*").evaluate(document, XPathConstants.NODESET);

确实显示了 cmets,但也弄乱了页面解析。

是否有一个正则表达式既可以正确格式化它,也可以包含 cmets?或者也许以比使用正则表达式更容易的另一种形式执行此操作?

【问题讨论】:

  • 您可以发布您的 xml 文件的示例吗?

标签: java regex xml xpath xml-parsing


【解决方案1】:

XPath.compile 编译 XPath 表达式,而不是 Regex 表达式。它们完全不相关。

XPath 表达式//*[not(*)] 选择文档中没有子元素的所有元素(即所有叶元素)。它的工作方式是:

  1. // 扩展为 /descendant-or-self::node()/
  2. * 扩展为 child::element()
  3. not(X),其中X是一个节点集,测试节点集是否为空。

所以表达的意思

/descendant-or-self::node()/child::element()[empty(child::element())]

它选择文档中某事物的所有子元素(实际上,所有元素都是某事物的子元素),然后过滤此集合以仅保留那些child::element() 不返回任何内容的元素,即那些具有没有子元素。

但首先你需要弄清楚这与正则表达式有什么关系。如果您搜索正则表达式教程希望获得有关 XPath 的见解,您会感到非常困惑。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-07-26
  • 2014-12-17
  • 2014-01-29
  • 2020-07-08
  • 1970-01-01
  • 2020-07-18
  • 2012-05-12
  • 2012-10-26
相关资源
最近更新 更多