Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Xml XPath选择不同名称空间中的节点_Xml_Xpath_Jxpath - Fatal编程技术网

Xml XPath选择不同名称空间中的节点

Xml XPath选择不同名称空间中的节点,xml,xpath,jxpath,Xml,Xpath,Jxpath,我需要一些帮助,以找到一个合适的XPath表达式来从XML中提取值 我可以使用jaxb获取值,但是我需要xpath,因为我有一种决策表类型的映射规则,我希望将其外部化,如果我使用jaxb,将导致大量嵌套的if/else语句,我希望避免这些语句,因此需要xpath方法 我有一个xml文件,它至少由4个模式构成。我的意思是根模式在一个特定的点上有一个元素,表示xs:any,在这个位置,一个基于不同模式的xml被注入,而这反过来又有一个类似的xs:any,其中注入了另一个xml来构建我使用的最终/实际

我需要一些帮助,以找到一个合适的XPath表达式来从XML中提取值

我可以使用jaxb获取值,但是我需要xpath,因为我有一种决策表类型的映射规则,我希望将其外部化,如果我使用jaxb,将导致大量嵌套的if/else语句,我希望避免这些语句,因此需要xpath方法

我有一个xml文件,它至少由4个模式构成。我的意思是根模式在一个特定的点上有一个元素,表示xs:any,在这个位置,一个基于不同模式的xml被注入,而这反过来又有一个类似的xs:any,其中注入了另一个xml来构建我使用的最终/实际xml

这是我正在处理的实际XML结构,我特意修改了这些值

提取前几个元素没有问题 like/env:信封/env:Body/cdt业务数据

cdtBusinessData是主模式中采用xs:any的元素 。架构片段如下所示

                <xs:element name="cdtBusinessData" form="unqualified">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any minOccurs="0"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
正是从这一点出发,我的xpath查询并没有按照我期望的方式工作

i、 e当我尝试/env:Envelope/env:Body/cdtBusinessData/Document时,它没有确定它是jxpath上的正确路径。 在为所选节点提供XPathR/firepath/XpathBuilder等xpath的不同工具上,我得到了不同的值,xpath不接受这些值

请您帮助我理解如何从上述xml中的两个嵌入节点提取值

我已经为此奋斗了很长一段时间,终于在这里寻求帮助。 如果你能帮我纠正这条路,我将不胜感激 //环境:信封/env:Body/cdt业务数据/文档

使现代化 这是我根据你的建议提出的。我正在使用 jxpath 1.3. 我做错了什么?我在sysout旁边有内联注释,以指示我得到了什么

如果在JXPath中有以下名称空间前缀

JXPathContext.registerNamespace("sw", "urn:swift:xsd:seev.031.002.05")
JXPathContext.registerNamespace("env", "CDTS-SUBMIT")
然后是下面的XPath

/env:Envelope/env:Body/cdtBusinessData/sw:Document
将成功选择urn:swift:xsd:seev.031.002.05命名空间中的文档元素

使现代化 如果要在其他名称空间中选择文档元素,请为新名称空间注册一个类似的前缀,并在XPath中使用它

通常首选使用已注册的名称空间前缀,但如果希望忽略名称空间,则在XPath 2.0中可以使用*:Document技术

在XPath 1.0中,*:技术不起作用,但您可以根据元素的本地名称进行测试:

//*[local-name() = 'Document']
将选择所有文档元素,而不考虑名称空间和传统。

如果JXPath中有以下名称空间前缀

JXPathContext.registerNamespace("sw", "urn:swift:xsd:seev.031.002.05")
JXPathContext.registerNamespace("env", "CDTS-SUBMIT")
然后是下面的XPath

/env:Envelope/env:Body/cdtBusinessData/sw:Document
将成功选择urn:swift:xsd:seev.031.002.05命名空间中的文档元素

使现代化 如果要在其他名称空间中选择文档元素,请为新名称空间注册一个类似的前缀,并在XPath中使用它

通常首选使用已注册的名称空间前缀,但如果希望忽略名称空间,则在XPath 2.0中可以使用*:Document技术

在XPath 1.0中,*:技术不起作用,但您可以根据元素的本地名称进行测试:

//*[local-name() = 'Document']
将选择所有文档元素,而不考虑名称空间和传统。

如果希望能够选择其中一个,请为文档使用名称空间通配符:

/env:Envelope/env:Body/cdtBusinessData/*:Document
…或者,要在一个查询中获取两个文档:

//*:Document
查看完整的XQuery文档,您可以自己运行该文档来查看它的工作情况

上述版本与XPath 1.0兼容:

……或者

//*[local-name() = 'Document']
如果希望能够选择以下任一项,请为文档使用命名空间通配符:

/env:Envelope/env:Body/cdtBusinessData/*:Document
…或者,要在一个查询中获取两个文档:

//*:Document
查看完整的XQuery文档,您可以自己运行该文档来查看它的工作情况

上述版本与XPath 1.0兼容:

……或者

//*[local-name() = 'Document']

我假设你想让它与允许在任何名称空间中的文档一起工作?来自Amit K:你有你在问题中提出的xml模式吗?我假设你想让它与允许在任何名称空间中的文档一起工作?来自Amit K:你有你在问题中提出的xml模式吗?Thx v非常感谢你的快速响应,但我担心我仍然不在。我已经用一个测试类更新了原始问题,该测试类是我根据你们的建议提出的。我仍然得到一个空值,而不是所需的值。请告诉我哪里出了问题。对于您的最后一次XPath试用,请注意,CorpActnNtfctn也位于其祖先的默认名称空间中,因此前面必须有一个d:名称空间前缀。缺乏这种理解也是许多其他示例失败的原因。除非XPath处理器支持XPath,否则使用*:的无法工作
2.0.你介意我在我的答案中加入当地名字的方法吗?@CharlesDuffy:请随意加入来自此答案或我的任何答案的材料。乐于助人,被邀请受宠若惊。谢谢。Thx v非常感谢您的及时回复,但我恐怕还没有回答。我已经用一个测试类更新了原始问题,该测试类是我根据你们的建议提出的。我仍然得到一个空值而不是所需的值。请您告诉我哪里出了问题。对于您最后的XPath试用,请注意,CorpActnNtfctn也位于其祖先的默认名称空间中,因此前面必须有一个d:名称空间前缀。缺乏这种理解也是许多其他示例失败的原因。使用*:的方法无法工作,除非XPath处理器支持XPath 2.0。您介意我将本地名称方法合并到我的答案中吗?@CharlesDuffy:请随意合并来自此或我的任何答案的材料。乐于助人,被邀请受宠若惊。非常感谢。