Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SimpleXML和xpath解析Zimbra SOAP响应_Php_Xml_Soap_Xpath_Zimbra - Fatal编程技术网

Php 使用SimpleXML和xpath解析Zimbra SOAP响应

Php 使用SimpleXML和xpath解析Zimbra SOAP响应,php,xml,soap,xpath,zimbra,Php,Xml,Soap,Xpath,Zimbra,因此,我使用PHP与Zimbra SOAP服务器进行对话。响应位于标记中。由于命名空间的原因,我在解析XML响应时遇到问题 XML如下所示: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> <context xmlns="urn:zimbra"> <change token="20333"/> <

因此,我使用PHP与Zimbra SOAP服务器进行对话。响应位于
标记中。由于命名空间的原因,我在解析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>
在谷歌搜索了一下之后,我发现我需要注册名称空间。所以我这样做:

$xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope');
这样我就可以很容易地得到
标签

$body = $xml->xpath('//soap:Body');
但在这之后,我无法获取任何元素(使用xpath):

这将返回一个空数组。不过,我可以遍历XML以获取该元素

$CreateAccountResponse = $body[0]->CreateAccountResponse;
这很好,但是现在我想要得到
标签,特别是
zimbraId
标签。所以我试了一下:

$zimbraId = $CreateAccountResponse->account->xpath('a[@n=zimbraId]');
不走运,我得到一个空白数组。发生什么事?为什么我不能使用xpath获取元素(不是以
soap:
开头的元素)

如何根据标签的
n
属性获取标签

另外,我知道
id
name
也在
标记的属性中,但是我想使用
n
属性获得更多的
标记

注意:我正在努力为我的工作申请改进Zimbra库。获取
标记的当前代码如下:

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

$zimbraId=substr($zimbraId,1,strpos($zimbraId,“要检索的元素也有一个名称空间,即
urn:zimbraAdmin

    <CreateAccountResponse xmlns="urn:zimbraAdmin">

要检索的元素也有一个名称空间,即
urn:zimbraAdmin

    <CreateAccountResponse xmlns="urn:zimbraAdmin">

很酷,谢谢。这就成功了。一旦我注册了
zimbra
名称空间,它就可以工作了(只要我在所有内容前面加上
zimbra:
)。我使用这个xpath查询来获得我想要的元素:
'//soap:Body/zimbra:CreateAccountResponse/zimbra:account/zimbra:a[@n=“zimbraId”]“
。我还意识到,如果我将元素保存到变量中,我必须在元素上注册
XPathNamespace
。例如
$x=$CreateAccountResponse[0]->account;
我必须执行
$x->registerXPathNamespace('zimbra',urn:zimbraAdmin');
才能让它工作。然后我可以执行
$x->xpath('zimbra:a[@n=“zimbraId”]))
。不幸的是,这篇文章似乎与事实相符:很酷,谢谢。这就成功了。一旦我注册了
zimbra
名称空间,它就一切正常(只要我在所有内容前面加上
zimbra:
)。我使用这个xpath查询this来获取我想要的元素:
”//soap:Body/zimbra:CreateAccountResponse/zimbra:account/zimbra:a[@n=“zimbraId”]
。我还意识到如果我将元素保存到变量中,我必须在元素上注册
XPathNamespace
。例如
$x=$CreateAccountResponse[0]->account;
我必须做
$x->registerXPathNamespace('zimbra','urn:zimbraAdmin');
才能让它工作。然后我可以做
$x->xpath('zimbra:a[@n=“zimbraId”]”)
。不幸的是,这篇文章似乎与事实相吻合:
    <CreateAccountResponse xmlns="urn:zimbraAdmin">
$xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope');
$xml->registerXPathNamespace('zimbra', 'urn:zimbraAdmin');
$CreateAccountResponse = $xml->xpath('//soap:Body/zimbra:CreateAccountResponse');