在Axis 2 Web服务上没有AXIOMXPath的结果

时间:2012-06-26 09:18:23

标签: xpath axis2 axiom

我使用ServiceClient对象(无客户端代码生成)从Java Axis 2客户端调用SharePoint 2010 Web服务。

我需要使用xPath查询结果,以便在未来的开发中获得结果代码和其他数据。

我无法使用AXIOMXPath获得结果...

以下是网络服务电话的结果:

<CopyIntoItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/">
    <CopyIntoItemsResult>0</CopyIntoItemsResult>
    <Results>
        <CopyResult ErrorCode="Success" DestinationUrl="http://mss2010-vm1/siteBdL/GED/obligations/obli_interne.pdf">
        </CopyResult>
    </Results>
</CopyIntoItemsResponse>

我的代码:

OMElement result = client.sendReceive(copyService);

if (result != null) {
    AXIOMXPath xpathExpression = new AXIOMXPath("/CopyIntoItemsResponse/Results/CopyResult/@ErrorCode"); 

    xpathExpression.addNamespace("", "http://schemas.microsoft.com/sharepoint/soap/");

    Object node = xpathExpression.selectNodes(result); 

    if (node != null) {
      OMAttribute attribute = (OMAttribute) node; 

      if (attribute.getAttributeValue().equals("Success")) {
        succeeded = true;
      }
    }
}

请问好吗?

1 个答案:

答案 0 :(得分:0)

我看到两件可能导致问题的事情:

  • 编译XPath表达式时,将命名空间绑定到空前缀。这是Jaxen允许的(这是Axiom使用的XPath实现),但这是不寻常的,不推荐。 XML规范,例如XSLT,例如不允许:在XSLT中,出现在XPath表达式中的非限定名称始终被解释为没有名称空间的名称,即使作用域中存在默认名称空间也是如此。在您的情况下,XPath表达式的@ErrorCode部分可能存在问题。它应该匹配没有命名空间的ErrorCode属性,但我认为@ErrorCode实际上意味着具有本地名称ErrorCode和命名空间http://schemas.microsoft.com/sharepoint/soap/的属性(我不是100%肯定在这里;我将不得不参考XPath规范。
  • XPath表达式中的第一个/与包含上下文节点的树的根节点(即传递给selectNodes的节点)相匹配。对于sendReceive的结果,这可能是包含整个SOAP消息的文档节点。要避免该问题,请创建新的OMDocument并将sendReceive的结果添加到该文档中,或使用self::CopyIntoItemsResponse/...作为XPath表达式。