虽然有很多选项可以将“普通”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数组 - 感谢:)
答案 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);
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);
然后我能够遍历这个并正常处理。