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

时间:2014-02-19 09:05:12

标签: php xml arrays json cdata

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

<?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字符串中还有大约99个对象,所以为简单起见我只包含1个

我想将一个数组转换为JSON或PHP数组 - 感谢:)

2 个答案:

答案 0 :(得分:0)

别。只需在DOM上使用Xpath来获取部件,在您的情况下是CDATA部分中的JSON结构。

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

$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);

输出https://eval.in/105256

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"
  }
}

答案 1 :(得分:-1)

鉴于我无法用任何解决方案解决问题,我一直在挖掘并做了一些测试。我的解决方案并不漂亮,但肯定是功能性的。 我删除了所有的XML数据,并留下了相当原始的JSON。在这种情况下,使用JSON数据的问题是字符串不包含在“”中,所以我做了一个str_replace来解决这个问题并且一切正常。     $ content = str_replace('','',str_replace(“\'”,“'”,$ content)));

$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);

然后我能够遍历这个并正常处理。