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我知道idandname也在<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 回答