Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将以下XML数据转换为数组(JSON或其他格式)_Php_Xml_Arrays_Json_Cdata - Fatal编程技术网

Php 如何将以下XML数据转换为数组(JSON或其他格式)

Php 如何将以下XML数据转换为数组(JSON或其他格式),php,xml,arrays,json,cdata,Php,Xml,Arrays,Json,Cdata,虽然有很多将“普通”XML转换成数组的选项,但我非常希望找到一种方法,将这些数据转换成一个可以用PHP处理的数组(目前设计为由JQuery处理) 这个xml字符串中还有大约99个对象,因此为了简单起见,我只包含了1个 我想把数组转换成JSON或PHP数组——谢谢:)不要。只需在DOM上使用Xpath来获取部分,在您的例子中是CDATA部分中的JSON结构 该结构不是真正的JSON,而是Javascript,缺少属性名称周围的引号。这是PHP手册中一个很好的正则表达式,可以修复它 $xml =

虽然有很多将“普通”XML转换成数组的选项,但我非常希望找到一种方法,将这些数据转换成一个可以用PHP处理的数组(目前设计为由JQuery处理)


这个xml字符串中还有大约99个对象,因此为了简单起见,我只包含了1个


我想把数组转换成JSON或PHP数组——谢谢:)

不要。只需在DOM上使用Xpath来获取部分,在您的例子中是CDATA部分中的JSON结构

该结构不是真正的JSON,而是Javascript,缺少属性名称周围的引号。这是PHP手册中一个很好的正则表达式,可以修复它

$xml = <<<'XML'
<?xml version="1.0" encoding="ISO-8859-15"?><root><data><![CDATA[ [{title_id: "284270",
          track_id: "1548617",
          artist: [[20670, 1, "Matthias Vogt", "matthias-vogt"]],
          title: "The Wobble Track",
          title_url: "/title/284270/the-wobble-track",
          track_url: "/track/1548617/the-wobble-track",
          label: [88, "Large Music", "large-music"],
          genre: "Deep House",
          genre_url: "/genre/13/deep-house",
          catnumber: "LAR181",
          promo: false,
          duration: "5:54",
          r_date: "2014-02-17",
          price: {hbr: 1.99, wav: 2.74},
          bought: false,
          image: "http://static.traxsource.com/files/images/271306_large.jpg",
          thumb: "http://static.traxsource.com/scripts/image.php/44x44/271306.jpg",
          mp3: "http://preview.traxsource.com/files/previews/88/1324290-p.mp3",
          waveform: "http://static.traxsource.com/files/wf/1324290-wf.png",
          bpm: "120",
          keysig: "Bmin"}
] ]]></data></root>
XML;

function javascript_decode($json, $assoc = FALSE){
  $json = str_replace(array("\n","\r"),"",$json);
  $json = preg_replace('(([{,]+)(\s*)([^"]+?)\s*:)','$1"$3":',$json);
  return json_decode($json,$assoc);
} 

$dom = new DOMDocument();
//$dom->load($xmlFile);
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$json = javascript_decode($xpath->evaluate('string(/root/data)'));
var_dump($json);

考虑到我无法用任何解决方案解决问题,我继续挖掘并做了一些测试。我的解决方案并不漂亮,但肯定很实用。 我删除了所有XML数据,留下了相当原始的JSON。在本例中,JSON数据的问题是字符串没有包装在“”中,所以我做了一个str_替换来修复这个问题,并且一切正常。 $content=str_replace(“”,“,”,str_replace(“\”,“'”,$content))


然后我就可以循环并正常处理了。

谢谢,但是var_dump只给了我NULL,我是否遗漏了什么?如果没有加载XML,或者JSON无效,可能会发生这种情况。我编辑了答案,并添加了示例数据和一个实时链接。你能用我问题中包含的实际数据来实现这一点吗?还是数据格式不正确?如果没有,那么你对如何解决我的问题有什么想法吗?不完整的问题?不,当然JSON不能被解码,它是不完整的。XML阅读部分对它起作用,但是:好的,但是我仍然不清楚您的答案如何解决我遇到的问题。。。?
$xml = <<<'XML'
<?xml version="1.0" encoding="ISO-8859-15"?><root><data><![CDATA[ [{title_id: "284270",
          track_id: "1548617",
          artist: [[20670, 1, "Matthias Vogt", "matthias-vogt"]],
          title: "The Wobble Track",
          title_url: "/title/284270/the-wobble-track",
          track_url: "/track/1548617/the-wobble-track",
          label: [88, "Large Music", "large-music"],
          genre: "Deep House",
          genre_url: "/genre/13/deep-house",
          catnumber: "LAR181",
          promo: false,
          duration: "5:54",
          r_date: "2014-02-17",
          price: {hbr: 1.99, wav: 2.74},
          bought: false,
          image: "http://static.traxsource.com/files/images/271306_large.jpg",
          thumb: "http://static.traxsource.com/scripts/image.php/44x44/271306.jpg",
          mp3: "http://preview.traxsource.com/files/previews/88/1324290-p.mp3",
          waveform: "http://static.traxsource.com/files/wf/1324290-wf.png",
          bpm: "120",
          keysig: "Bmin"}
] ]]></data></root>
XML;

function javascript_decode($json, $assoc = FALSE){
  $json = str_replace(array("\n","\r"),"",$json);
  $json = preg_replace('(([{,]+)(\s*)([^"]+?)\s*:)','$1"$3":',$json);
  return json_decode($json,$assoc);
} 

$dom = new DOMDocument();
//$dom->load($xmlFile);
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$json = javascript_decode($xpath->evaluate('string(/root/data)'));
var_dump($json);
array(1) {
  [0]=>
  object(stdClass)#3 (21) {
    ["title_id"]=>
    string(6) "284270"
    ["track_id"]=>
    string(7) "1548617"
    ["artist"]=>
    array(1) {
      [0]=>
      array(4) {
        [0]=>
        int(20670)
        [1]=>
        int(1)
        [2]=>
        string(13) "Matthias Vogt"
        [3]=>
        string(13) "matthias-vogt"
      }
    }
    ["title"]=>
    string(16) "The Wobble Track"
    ["title_url"]=>
    string(30) "/title/284270/the-wobble-track"
    ["track_url"]=>
    string(31) "/track/1548617/the-wobble-track"
    ["label"]=>
    array(3) {
      [0]=>
      int(88)
      [1]=>
      string(11) "Large Music"
      [2]=>
      string(11) "large-music"
    }
    ["genre"]=>
    string(10) "Deep House"
    ["genre_url"]=>
    string(20) "/genre/13/deep-house"
    ["catnumber"]=>
    string(6) "LAR181"
    ["promo"]=>
    bool(false)
    ["duration"]=>
    string(4) "5:54"
    ["r_date"]=>
    string(10) "2014-02-17"
    ["price"]=>
    object(stdClass)#4 (2) {
      ["hbr"]=>
      float(1.99)
      ["wav"]=>
      float(2.74)
    }
    ["bought"]=>
    bool(false)
    ["image"]=>
    string(58) "http://static.traxsource.com/files/images/271306_large.jpg"
    ["thumb"]=>
    string(63) "http://static.traxsource.com/scripts/image.php/44x44/271306.jpg"
    ["mp3"]=>
    string(61) "http://preview.traxsource.com/files/previews/88/1324290-p.mp3"
    ["waveform"]=>
    string(52) "http://static.traxsource.com/files/wf/1324290-wf.png"
    ["bpm"]=>
    string(3) "120"
    ["keysig"]=>
    string(4) "Bmin"
  }
}
$keys = array("title_id:",
"track_id:",
"artist:",
"title:",
"title_url:",
"track_url:",
"label:",
"genre:",
"genre_url:",
"catnumber:",
"promo:",
"duration:",
"r_date:",
"price:",
"hbr:",
"wav:",
"bought:",
"false",
"image:",
"thumb:",
"mp3:",
"waveform:",
"bpm:",
"keysig:"
);
$newkeys = array("\"title_id\":",
"\"track_id\":",
"\"artist\":",
"\"title\":",
"\"title_url\":",
"\"track_url\":",
"\"label\":",
"\"genre\":",
"\"genre_url\":",
"\"catnumber\":",
"\"promo\":",
"\"duration\":",
"\"r_date\":",
"\"price\":",
"\"hbr\":",
"\"wav\":",
"\"bought\":",
"\"false\"",
"\"image\":",
"\"thumb\":",
"\"mp3\":",
"\"waveform\":",
"\"bpm\":",
"\"keysig\":"
);
$content=  str_replace($keys, $newkeys, $content);
$json = json_decode($content, true);