Analisando a resposta SOAP do Zimbra com SimpleXML e xpath

Então, estou usando o PHP para conversar com um servidor SOAP da Zimbra. A resposta está em uma etiqueta . Estou tendo problemas para analisar a resposta XML por causa dos namespace (s).

O XML parece assim:

          83ebf344-dc51-47ae-9a36-3eb24281d53e iamtesting@example.com     

Eu SimpleXMLElement um novo object SimpleXMLElement :

 $xml = new SimpleXMLElement($data); 

Depois de pesquisar um pouco, descobri que preciso registrar o namespace. Então eu faço isso:

 $xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope'); 

Então eu posso obter a etiqueta facilmente.

 $body = $xml->xpath('//soap:Body'); 

Mas não consigo obter nenhum elemento depois disso (usando xpath):

 $CreateAccountResponse = $xml->xpath('//soap:Body/CreateAccountResponse'); 

Isso retorna uma matriz vazia. Posso atravessar o XML, porém, para obter esse elemento.

 $CreateAccountResponse = $body[0]->CreateAccountResponse; 

Isso funciona bem, mas agora eu quero obter as tags , especificamente o zimbraId . Então eu tentei isso:

 $zimbraId = $CreateAccountResponse->account->xpath('a[@n=zimbraId]'); 

Sem sorte, recebo uma matriz em branco. O que está acontecendo? Por que não posso usar o xpath para obter elementos (que não começam com o soap: :)?

Como posso obter as tags base em seu atributo n ?

PS Estou ciente de que o id e o name também estão nos atributos da tag , mas há um monte de tags que eu quero usar usando o atributo n .

Nota: Estou tentando melhorar a biblioteca Zimbra para o meu pedido de trabalho. O código atual para obter as tags é o seguinte:

 $zimbraId = strstr($data, ""); $zimbraId = substr($zimbraId, 1, strpos($zimbraId, "<") - 1); 

Obviamente, eu quero remover esse código (também há alguns regexes ( shudder ) mais tarde no código) e use um analisador XML.

Os elementos que você deseja recuperar também têm um namespace, nomeadamente urn:zimbraAdmin .

   

O atributo xmlns indica o espaço de nomes padrão para qualquer elemento filho, então os elementos que você está tentando recuperar realmente têm um espaço para nome, mesmo que nenhum prefixo seja usado (veja o artigo da wikipedia para alguns exemplos). Se você especificar um prefixo do namespace como fez para http://www.w3.org/2003/05/soap-envelope você deveria estar bem.

 $xml->registerXPathNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope'); $xml->registerXPathNamespace('zimbra', 'urn:zimbraAdmin'); $CreateAccountResponse = $xml->xpath('//soap:Body/zimbra:CreateAccountResponse');