fork(2) download
  1. <?php /* PHP5.6.4 */
  2. $data = '<root>
  3. <test1:abc>値1</test1:abc>
  4. <test2 属性名="属性値">値2</test2>
  5. <test3><![CDATA[値3]]></test3>
  6. </root>';
  7.  
  8. echo "--- bad case ---\n";
  9. //$xml = new SimpleXMLElement($data);
  10. //echo json_encode($xml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;
  11. $objXml = simplexml_load_string($data);
  12. echo json_encode($objXml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;
  13.  
  14. echo "--- good case ---\n";
  15. echo xml_to_json($data);
  16.  
  17. function xml_to_json($xml)
  18. {
  19. $xml = preg_replace("/<([^>]+?):([^>]+?)>/", "<$1_$2>", $xml); // コロンをアンダーバーに(名前空間対策)
  20. $xml = preg_replace("/_\/\//", "://", $xml); // プロトコルのは元に戻す
  21. $objXml = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
  22. xml_expand_attributes($objXml); // 属性を展開する
  23. $json = json_encode($objXml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
  24. return preg_replace('/\\\\\//', '/', $json); // "\/" ⇒ "/" に置換
  25. }
  26.  
  27. function xml_expand_attributes($node)
  28. {
  29. if($node->count() > 0) {
  30. foreach($node->children() as $child)
  31. {
  32. foreach($child->attributes() as $key => $val) {
  33. $node->addChild($child->getName()."@".$key, $val);
  34. }
  35. xml_expand_attributes($child); // 再帰呼出
  36. }
  37. }
  38. }
  39. ?>
Success #stdin #stdout #stderr 0s 52488KB
stdin
Standard input is empty
stdout
--- bad case ---
{
    "test1:abc": "値1",
    "test2": "値2",
    "test3": {}
}
--- good case ---
{
    "test1_abc": "値1",
    "test2": "値2",
    "test3": "値3",
    "test2@属性名": "属性値"
}
stderr
PHP Warning:  simplexml_load_string(): namespace error : Namespace prefix test1 on abc is not defined in /home/69SrSj/prog.php on line 11
PHP Warning:  simplexml_load_string():     <test1:abc>値1</test1:abc> in /home/69SrSj/prog.php on line 11
PHP Warning:  simplexml_load_string():               ^ in /home/69SrSj/prog.php on line 11