我目前正在尝试从谷歌联系人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信息。
答案 0 :(得分:1)
以下是手册中的内容
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