そのため、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 パーサーを使用します。