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

ここで問題を引き起こす可能性のある 2 つのことがわかります。

  • 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 に答える