0

我创建了一个 Axis2 Web 服务客户端。返回的响应是:

<GetOpenPOsResponse xmlns="https://www.mycompany.net/">
<GetOpenPOsResult>
    <acXML xmlns="https://www.mycompany.net/acXMLSchema.xsd" lang="en-us">
        <Header>
            <From>
                <Company>Company Name</Company>
                <Identity>Id</Identity>
                <DatabaseName>Database</DatabaseName>
            </From>
        </Header>
        <Request/>
    </acXML>
</GetOpenPOsResult>

如果我使用以下命令,我可以通过 xpath 选择节点:

OMElement result = sender.sendReceive();
StAXOMBuilder builder = new StAXOMBuilder(result.getXMLStreamReader());
OMElement root = builder.getDocumentElement();

AXIOMXPath xpath = new AXIOMXPath("/*[name()='GetOpenPOsResponse']/*[name()='GetOpenPOsResult']/*[name()='acXML']/*[name()='Header']/*[name()='From']/*[name()='Company']");
OMElement selectedNode = (OMElement) xpath.selectSingleNode(root);
System.out.println(selectedNode.getText());

这将返回:公司名称

但我想使用命名空间来简化 xpath 表达式,如下所示:

xpath.addNamespace("y", "https://www.mycompany.net");
xpath.addNamespace("x", "https://www.mycompany.net/acXMLSchema.xsd");

并将 xpath 表达式更改为:

 AXIOMXPath xpath = new AXIOMXPath("/y:GetOpenPOsResponse/y:GetOpenPOsResult/x:acXML/x:Header/x:From/x:Company");

但是以这种方式选择节点会返回 null。我已经看到了这种方法应该适用的其他解决方案,但我似乎无法让它为我工作。
我究竟做错了什么??

谢谢你。

4

1 回答 1

0

当我更正“ https://www.mycompany.net ”的名称空间时,这可以完美地工作。我忘记了最后的“/”。

xpath.addNamespace("y", "https://www.mycompany.net/");
于 2015-08-12T17:40:46.813 回答