Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从XPath表达式获取/列出前缀_Java_Xml_Xpath - Fatal编程技术网

Java 从XPath表达式获取/列出前缀

Java 从XPath表达式获取/列出前缀,java,xml,xpath,Java,Xml,Xpath,我有一些XML(实际上)文档,其中包含一些元素,这些元素的test属性包含XPath表达式: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <link:linkbase xmlns:ea="http://xbrl.org/2008/assertion/existence" xmlns:generic="http://xbrl.org/2008/generic" xmlns:link="

我有一些
XML
(实际上)文档,其中包含一些元素,这些元素的
test
属性包含XPath表达式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<link:linkbase 
    xmlns:ea="http://xbrl.org/2008/assertion/existence"
    xmlns:generic="http://xbrl.org/2008/generic" 
    xmlns:link="http://www.xbrl.org/2003/linkbase"
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xff="http://www.xbrl.org/2010/function/formula">

  <generic:link xlink:role="http://www.xbrl.org/2003/role/link" xlink:type="extended">

  <!-- .... -->
  <va:valueAssertion 
    ... some attribs ...
    test="if(xff:has-fallback-value(xs:QName('someQName'))) then false() else (count($someVariable) ge 1)"
    />

  <!-- ... -->
  </generic:link>
</link:linkbase>

处理XPath表达式的约定是,它使用与XML文档中声明的前缀相同的名称空间

我们还有一些(自定义)linting机制,其中包含一条规则,用于检查文档中是否“使用”了声明的前缀及其名称空间

这意味着在上面的xml示例中,xff和xs前缀应该被识别为“已使用”,因为它们存在于XPath表达式中。然而,标准工具(Java内部)并不能帮助我们看到这种情况

例如,我可以在范围中选取所有前缀,并检查是否可以在XPath字符串中找到“prefix:”;但这似乎是一个非常有缺陷的解决方案,并且容易出现误报和漏报

另一种方法是使用所有可能的名称空间绑定组合“仅”计算XPath表达式,并检查最小名称空间集是什么。这也不会覆盖所有内容,因为评估可能会跳过整个代码分支。(例如,当遇到if语句时)。其次,由于我们讨论了许多(~100个)包含多个XPath表达式的文档,因此可能性的爆炸式增长非常快


有人知道解决这个问题的好方法吗?目前,我们正在JVM上使用Scala来实现检查。因此,首选本机Java或Scala解决方案。如果需要,可以使用其他JVM语言或依赖于非java工具。

使用
javax.xml.xpath.xpath#compile(String)
解析文档中的所有xpath表达式

要知道表达式中引用了哪些名称空间前缀,请在调用compile方法之前准备一个
NamespaceContext
实现,该实现记录请求的名称空间绑定的前缀,并通过
XPath\setNamespaceContext(NamespaceContext)
进行设置


基于该前缀列表,并给定包含表达式字符串的属性上的名称空间绑定,然后可以构建所有已使用名称空间的列表。

有趣的方法!如果我错了,请纠正我,但这不意味着也要计算表达式吗?(也就是说,不仅仅是编译它?)在我的问题中,我没有明确指出这一点,但问题的本质是,我们需要生成多个输入文档才能计算所有XPath表达式。XBRL断言的本质是先进行一些过滤;如果没有剩余内容,则不会使用该表达式。因为我们正在寻找(静态)代码分析;我们希望对表达式的上下文保持不可知状态。@mhogerheijde编译并不意味着计算。它提供表达式使用的名称空间前缀的确切列表。但你的评论似乎表明,你的问题不能单靠静态分析来解决。那么,在你的情况下,我会重新考虑扩大线绳的要求,我认为我们可以摆脱静态分析。例如,当某人使用字符串连接来创建前缀时,可能会发出假阴性;但这应该由XML文档的创建者来解决。我对编译和评估的困惑是因为我认为名称空间上下文只会在评估期间使用,但显然我错了。我正在尝试您的解决方案,谢谢!