我从XML文件中检索到XML String。我无法使用simplexml_load_file()
直接访问该文件。原因是我必须通过Amazon S3 getObject()获得这个。当我echo
字符串时,我可以看到输出为真正的XML文件。但是当我尝试使用波纹管代码将其加载到XML对象时,它不起作用。变量$s3Data
完全包含给定链接中的XML内容。
$xml = simplexml_load_string($s3Data);
我需要你的帮助来解决这个问题。我得到的XML字符串可以在这里找到。
http://mediatheques-aphp.bibliomedias.net/12.xml
修改
我创建了XML字符串并进行了测试。现在我得到以下错误。我该如何解决这些问题。
警告:simplexml_load_string()[function.simplexml-load-string]: 实体:第12行:解析器错误:输入不正确UTF-8,指示 编码!字节:C:\ Program中的0xEF 0x76 0x65 0x3C 文件\ Zend的\ Apache2的\ htdocs中\ voxmedia \程序\模块\进口\控制器\ NaiveController.php 在第1458行
警告:simplexml_load_string()[function.simplexml-load-string]: 2009年天真的C:\计划 文件\ Zend的\ Apache2的\ htdocs中\ voxmedia \程序\模块\进口\控制器\ NaiveController.php 在第1458行
警告:simplexml_load_string()[function.simplexml-load-string]:^ 在C:\ Program中 文件\ Zend的\ Apache2的\ htdocs中\ voxmedia \程序\模块\进口\控制器\ NaiveController.php 在第1458行
OK现在我觉得问题在于使用字符串编码等等。有什么方法可以解决这个问题吗?
感谢。
答案 0 :(得分:4)
simplexml_load_string
和simplexml_load_file
是错误的,并且在具有复杂标记的XML上无法正常工作。
我尝试了两个函数来解析一些VALID XML SOAP响应,甚至无法得到错误消息。
我不得不使用DOMDocument
代替(像魅力一样工作)。
以下是我们如何检查simplexml的错误(如果你很幸运看到错误,而不仅仅是从函数中返回“false”)
libxml_use_internal_errors(true);
$xml=simplexml_load_string($myXMLData); //or simplexml_load_file
foreach( libxml_get_errors() as $error ) {
print_r($error);
}
答案 1 :(得分:1)
我可以通过一个小的解决方法找到我的问题的答案。 simplexml_load_string()
不断显示编码错误。所以我使用simplexml_load_file()
如下所示。我已将文件保存到本地位置,然后使用simplexml_load_file()
加载。
$tempLocalPath = "temp/data.xml";
file_put_contents($tempLocalPath, $s3Data);
$xml = simplexml_load_file($tempLocalPath);
但是,我仍然不能理解为什么simplexml_load_string()
无法解析同样的事情。
答案 2 :(得分:0)
你应该试试这个:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
simplexml_load_string($result);
答案 3 :(得分:-1)
当你echo
一个实际上是一个对象的变量时,调用它的__toString()方法将对象转换为字符串,但是当你将对象传递给函数时,对象不会被转换。
使用:
$xml = simplexml_load_string( (string)$s3Data);
将$ s3Data对象强制转换为字符串。
PS: 使用var_dump($ s3Data)和var_dump($ xml)来调试变量的内容而不是echo。