Вопрос

I am working with Google's provisioning API and I am using PhP's SimpleXmlElement to parse the XML response.

SimpleXmlElement isn't parsing the response correctly. Here's a sample.

<?php

$xml_response = <<<EOD
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
  <id>https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com</id>
  <updated>2014-05-06T00:53:35.817Z</updated>
  <link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com'/>
  <link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com'/>
  <apps:property name='userEmail' value='liz@example.com' />
  <apps:property name='aliasEmail' value='helpdesk@gethelp_example.com' />
</entry>
EOD;
$xml = new SimpleXmlElement($xml_response);
print_r($xml);

?>

Output:

SimpleXMLElement Object
(
  [id] => https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com
  [updated] => 2014-05-06T00:53:35.817Z
  [link] => Array
    (
      [0] => SimpleXMLElement Object
        (
          [@attributes] => Array
            (
              [rel] => self
              [type] => application/atom+xml
              [href] => https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com
            )
          )
      [1] => SimpleXMLElement Object
        (
          [@attributes] => Array
            (
              [rel] => edit
              [type] => application/atom+xml
              [href] => https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com
            )
        )
    )
)

SimpleXmlElement simply drops the two <apps:property …\> entries. I am using PhP 5.3.28. Are there additional options/parameters I can use with SimpleXmlElement to get this to work?

Details about Google's provisioning api can be found at https://developers.google.com/google-apps/provisioning/

Это было полезно?

Решение

Tip o' the hat to MackieeE and Raf for his comment on Parse XML with Namespace using SimpleXML which led me to the appropriately titled blog post @ http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html

Here's what I had to do:

<?php
$xml_response = <<<EOD
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:apps='http://schemas.google.com/apps/2006'>
  <id>https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com</id>
  <updated>2014-05-06T00:53:35.817Z</updated>
  <link rel='self' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com'/>
  <link rel='edit' type='application/atom+xml' href='https://apps-apis.google.com/a/feeds/alias/2.0/gethelp_example.com/helpdesk%40gethelp%5Fexample.com'/>
  <apps:property name='userEmail' value='liz@example.com' />
  <apps:property name='aliasEmail' value='helpdesk@gethelp_example.com' />
</entry>
EOD;

$xml = new SimpleXmlElement($xml_response);
$alias_email = $xml->children('apps', true)->property[0]->attributes();
$user_email = $xml->children('apps', true)->property[1]->attributes();

$alias_email['value']; // gives you the aliasEmail value
$user_email['value']; // gives you the userEmail value
?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top