0

そのため、PHP を使用して Zimbra SOAP サーバーと通信しています。応答は<soap:Envelope>タグにあります。名前空間が原因で XML 応答を解析できません。

XML は次のようになります。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header>
    <context xmlns="urn:zimbra">
      <change token="20333"/>
    </context>
  </soap:Header>
  <soap:Body>
    <CreateAccountResponse xmlns="urn:zimbraAdmin">
      <account id="83ebf344-dc51-47ae-9a36-3eb24281d53e" name="iamtesting@example.com">
        <a n="zimbraId">83ebf344-dc51-47ae-9a36-3eb24281d53e</a>
        <a n="zimbraMailDeliveryAddress">iamtesting@example.com</a>
      </account>
    </CreateAccountResponse>
  </soap:Body>
</soap:Envelope>

新しいSimpleXMLElementオブジェクトを作成します:

$xml = new SimpleXMLElement($data);

少しグーグルした後、名前空間を登録する必要があることがわかりました。だから私はそれをします:

$xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope');

<soap:Body>そうすれば簡単にタグを取得できます。

$body = $xml->xpath('//soap:Body');

しかし、その後は要素を取得できません (xpath を使用):

$CreateAccountResponse = $xml->xpath('//soap:Body/CreateAccountResponse');

これは空の配列を返します。ただし、XML を走査してその要素を取得することはできます。

$CreateAccountResponse = $body[0]->CreateAccountResponse;

これはうまくいきますが、<a>タグ、特にタグを取得したいと思いますzimbraId。だから私はこれを試しました:

$zimbraId = $CreateAccountResponse->account->xpath('a[@n=zimbraId]');

運が悪い、空の配列を取得します。どうしたの?xpath を使用して (で始まらないsoap:) 要素を取得できないのはなぜですか?

属性<a>に基づいてタグを取得するにはどうすればよいですか?n

PSタグの属性にもidとがあることは承知していますが、属性を使用して取得したいタグがさらにたくさんあります。name<account><a>n

注: 仕事用のアプリケーション用に Zimbra ライブラリを改善しようとしています。タグを取得する現在のコード<a>は次のとおりです。

$zimbraId = strstr($data, "<a n=\"zimbraId\"");
$zimbraId = strstr($zimbraId, ">");
$zimbraId = substr($zimbraId, 1, strpos($zimbraId, "<") - 1);

明らかに、このコードを削除して (コードの後半にいくつかの正規表現 ( shudder ) もあります)、XML パーサーを使用します。

4

1 に答える 1

4

取得する要素には、名前空間、つまり。もありますurn:zimbraAdmin

    <CreateAccountResponse xmlns="urn:zimbraAdmin">

xmlns属性は、子要素のデフォルトの名前空間を示しているため、プレフィックスが使用されていなくても、取得しようとしている要素には実際には名前空間があります(いくつかの例についてはウィキペディアの記事を参照してください)。名前空間プレフィックスを指定した場合は、http://www.w3.org/2003/05/soap-envelope問題ありません。

$xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope');
$xml->registerXPathNamespace('zimbra', 'urn:zimbraAdmin');
$CreateAccountResponse = $xml->xpath('//soap:Body/zimbra:CreateAccountResponse');
于 2012-04-25T20:49:22.313 に答える