0

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

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

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

这是 Web 服务调用的结果:

<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;
      }
    }
}

请问有什么想法吗?

4

1 回答 1

0

我在这里看到两件事可能会导致问题:

  • 编译 XPath 表达式时,您将命名空间绑定到空前缀。Jaxen(这是 Axiom 使用的 XPath 实现)允许这样做,但这是不常见的,不推荐。XSLT 等 XML 规范不允许这样:在 XSLT 中,出现在 XPath 表达式中的非限定名称总是被解释为没有名称空间的名称,即使范围内有默认名称空间。@ErrorCode在您的情况下,XPath 表达式的一部分可能存在问题。预计会匹配ErrorCode没有命名空间的属性,但我认为这@ErrorCode实际上意味着具有本地名称ErrorCode和命名空间的属性http://schemas.microsoft.com/sharepoint/soap/(我在这里不是 100% 确定;我必须查阅 XPath 规范)。
  • XPath 表达式中的第一个/匹配包含上下文节点的树的根节点(即传递给的节点selectNodes)。这样做的结果sendReceive很可能是一个包含整个 SOAP 消息的文档节点。为避免该问题,请创建一个新文件OMDocument并将结果添加sendReceive到该文档或self::CopyIntoItemsResponse/...用作 XPath 表达式。
于 2012-06-26T17:22:40.713 回答