因此,我使用 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
andname
也在<account>
标签的属性中,但是<a>
我想使用该n
属性获得更多标签。
注意:我正在尝试为我的工作应用程序改进 Zimbra 库。当前获取<a>
标签的代码如下:
$zimbraId = strstr($data, "<a n=\"zimbraId\"");
$zimbraId = strstr($zimbraId, ">");
$zimbraId = substr($zimbraId, 1, strpos($zimbraId, "<") - 1);
显然,我想删除这段代码(代码后面还有一些正则表达式(shudder )),并使用 XML 解析器。