Php 使用SimpleXML和xpath解析Zimbra SOAP响应
因此,我使用PHP与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"/> <
标记中。由于命名空间的原因,我在解析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');