simplexml_load_string命名空间的正确参数

时间:2012-09-05 16:52:28

标签: php xml

我目前正在尝试从谷歌联系人api中提取信息。使用库中提供的示例代码:

$response = json_encode(simplexml_load_string($val->getResponseBody())); 
$result = json_decode($response, true);

simplexml_load_string函数没有获取名称空间。看看php.net以及如何添加参数我有点迷失。

$xml = json_encode(simplexml_load_string(null, $val->getResponseBody(), null, 'gd', true));
尝试从我的xml字符串中拉出'gd'命名空间的

事件我收到错误。是否有人可以提供协助?

输出错误是这样的:

  

simplexml_load_string()期望参数2是从SimpleXMLElement派生的类名

但除了这个错误之外,它还能正确打印出我想要的信息......我很困惑。

我需要提取的信息示例:

<gd:extendedProperty xmlns:gs='http://schemas.google_apps_sync.com' name='google_apps_sync'>
    <gs:em_odn1>awalker@xxxxx.com</gs:em_odn1>
    <gs:em_dn1>First Name Last Name</gs:em_dn1>
    <gs:em_ad1>awalker@xxxxxxxxx.com</gs:em_ad1>
    <gs:em_t1>SMTP</gs:em_t1>
    <gs:f_c>32791</gs:f_c>
    <gs:f>Last, First</gs:f>
  </gd:extendedProperty>

修改

$xmlResponse = simplexml_load_string($val->getResponseBody(), null, 0, 'gd', true);
$xmlResponse->registerXPATHNamespace('gd', 'http://schemas.google_apps_sync.com');
$xmlResponse->registerXPATHNamespace('gs', 'http://schemas.google_apps_sync.com/contact/2008');

上面的代码允许我访问我需要的命名空间,但一次只能访问一个...例如:

$email = json_encode($xmlResponse->xpath('//gd:email'), true));
$postal = json_encode($xmlResponse->xpath('//gd:postalAddress'), true);
$name = json_encode($xmlResponse->xpath('//gs:em_dn1'), true);

如果我打印这些变量,我会得到我需要的相应信息,但是在我启动了我想要的名称空间之后,我是否有办法访问原始的$xmlResponse变量?

例如:

json_decode($xmlResponse, true);

不会向我提供我已定义的命名空间的xml信息。

3 个答案:

答案 0 :(得分:1)

以下是手册中的内容

PHP.NET

simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] )
$xml = simplexml_load_string($val->getResponseBody(),null, 0, 'gd', true);
$xml =json_encode($xml); 

<强>更新

您没有正确使用命名空间,请显示您的所有xml结构。

在您显示的示例中,未定义名称空间gd。你需要这样的东西来使它工作:

<item xmlns:gd='http://schemas.google_apps_sync.com'> 
   <gd:extendedProperty xmlns:gs='http://schemas.google_apps_sync.com'..>
   ...
   </gd:extendedProperty>
</item>

现在你可以使用

$xml = simplexml_load_string($val->getResponseBody(),null, 0, 'gd', true);

当您想要访问gs命名空间时,您可以使用

$xml->registerXPathNamespace("gs", 'http://schemas.google_apps_sync.com');

答案 1 :(得分:1)

我发现在堆栈流上数小时结合信息并且谷歌相对没有文档...如果你将?alt=json添加到联系人api uri的末尾,你将收到JSON的回复!

答案 2 :(得分:1)

您可以使用子项获取包含名称空间的元素。例如:

<people xmlns:ns="http://something.com/ns">
<person><ns:name>Amy</ns:name></person>
<person><ns:name>Bill</ns:name></person>
</people>

$xml = simplexml_load_string($string);
echo $xml->person[0]->children("http://something.com/ns")->name; // will echo Amy