PHP SimpleXML解析问题

时间:2013-02-14 06:46:22

标签: php xml simplexml

我从我正在使用的api中返回以下内容..但是使用SIMPLEXML我无法访问这些值:

<?xml version="1.0" encoding="utf-16"?>
<Response Version="1.0">
   <DateTime>2/13/2013 10:37:24 PM</DateTime>
   <Contact_ID>151-233-DD</Contact_ID>
   <Quote_ID>ojc332-ewied-23e3ed</Quote_ID>
   <Status>Failure</Status>
   <Reason>Incorrect Contact ID</Reason>
</Response>

我正在设置:

$variable = new SimpleXMLElement($results);

SIMPLEXML给了我以下内容而不是我期望的内容     $可变&GT;日期时间:

SimpleXMLElement Object ( [0] => 2/13/2013 10:37:24 PM 151-233-DD 0jc332-ewied-23e3ed Failure Incorrect Contract ID ) 

非常感谢任何帮助

2 个答案:

答案 0 :(得分:6)

当内容为utf-16时,似乎是编码类型utf-8的原因。

所以你需要改变你的编码类型,

$string = '<?xml version="1.0" encoding="utf-16"?>
  <Response Version="1.0">
  <DateTime>2/13/2013 10:37:24 PM</DateTime>
  <Contact_ID>151-233-DD</Contact_ID>
  <Quote_ID>ojc332-ewied-23e3ed</Quote_ID>
  <Status>Failure</Status>
  <Reason>Incorrect Contact ID</Reason>
 </Response>'; 
$xml = simplexml_load_string(preg_replace('/(<\?xml[^?]+?)utf-16/i', '$1utf-8', $string)); 

Codepad DEMO

也可以使用utf8_encode

来完成
$xml = simplexml_load_string(utf8_encode($string)); 

答案 1 :(得分:0)

您只构建一个XML元素(提示类的名称)。您需要将整个字符串作为XML文档加载。方法如下:

<?php

$result= <<<XML
<?xml version="1.0" encoding="utf-8"?>
<Response Version="1.0">
   <DateTime>2/13/2013 10:37:24 PM</DateTime>
   <Contact_ID>151-233-DD</Contact_ID>
   <Quote_ID>ojc332-ewied-23e3ed</Quote_ID>
   <Status>Failure</Status>
   <Reason>Incorrect Contact ID</Reason>
</Response>
XML;

$dom= new DOMDocument();
$dom->loadXML($result, LIBXML_NOBLANKS);

然后,您可以使用DOM界面访问文档中的各种组件。

e.g。

$dates = dom->getElementsByTagName('DateTime');

这将获取包含所有DateTime元素的数组。

修改

糟糕 - $dates将成为DOMNodeList的对象。

然后,您可以使用各种方法访问节点并获取属性。