<?php /* PHP5.6.4 */
$data = '<root>
<test1:abc>値1</test1:abc>
<test2 属性名="属性値">値2</test2>
<test3><![CDATA[値3]]></test3>
</root>' ;
echo "--- bad case ---\n " ;
//$xml = new SimpleXMLElement($data);
//echo json_encode($xml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL;
echo json_encode ( $objXml , JSON_PRETTY_PRINT
| JSON_UNESCAPED_UNICODE
) . PHP_EOL
;
echo "--- good case ---\n " ;
echo xml_to_json( $data ) ;
function xml_to_json( $xml )
{
$xml = preg_replace ( "/<([^>]+?):([^>]+?)>/" , "<$1_ $2 >" , $xml ) ; // コロンをアンダーバーに(名前空間対策) xml_expand_attributes( $objXml ) ; // 属性を展開する
$json = json_encode ( $objXml , JSON_PRETTY_PRINT
| JSON_UNESCAPED_UNICODE
) ; return preg_replace ( '/\\\\\//' , '/' , $json ) ; // "\/" ⇒ "/" に置換 }
function xml_expand_attributes( $node )
{
foreach ( $node -> children ( ) as $child )
{
foreach ( $child -> attributes ( ) as $key => $val ) {
$node -> addChild ( $child -> getName ( ) . "@" . $key , $val ) ;
}
xml_expand_attributes( $child ) ; // 再帰呼出
}
}
}
?>
PD9waHAgLyogUEhQNS42LjQgKi8KJGRhdGEgPSAnPHJvb3Q+CiAgICA8dGVzdDE6YWJjPuWApDE8L3Rlc3QxOmFiYz4KICAgIDx0ZXN0MiDlsZ7mgKflkI09IuWxnuaAp+WApCI+5YCkMjwvdGVzdDI+CiAgICA8dGVzdDM+PCFbQ0RBVEFb5YCkM11dPjwvdGVzdDM+Cjwvcm9vdD4nOwoKZWNobyAiLS0tIGJhZCBjYXNlIC0tLVxuIjsKLy8keG1sID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoJGRhdGEpOwovL2VjaG8ganNvbl9lbmNvZGUoJHhtbCwgSlNPTl9QUkVUVFlfUFJJTlQgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKSAuIFBIUF9FT0w7CiRvYmpYbWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJGRhdGEpOwplY2hvIGpzb25fZW5jb2RlKCRvYmpYbWwsIEpTT05fUFJFVFRZX1BSSU5UIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSkgLiBQSFBfRU9MOwoKZWNobyAiLS0tIGdvb2QgY2FzZSAtLS1cbiI7CmVjaG8geG1sX3RvX2pzb24oJGRhdGEpOwoKZnVuY3Rpb24geG1sX3RvX2pzb24oJHhtbCkKewoJJHhtbCA9IHByZWdfcmVwbGFjZSgiLzwoW14+XSs/KTooW14+XSs/KT4vIiwgIjwkMV8kMj4iLCAkeG1sKTsgLy8g44Kz44Ot44Oz44KS44Ki44Oz44OA44O844OQ44O844Gr77yI5ZCN5YmN56m66ZaT5a++562W77yJCgkkeG1sID0gcHJlZ19yZXBsYWNlKCIvX1wvXC8vIiwgIjovLyIsICR4bWwpOyAvLyDjg5fjg63jg4jjgrPjg6vjga7jga/lhYPjgavmiLvjgZkKICAgICRvYmpYbWwgPSBzaW1wbGV4bWxfbG9hZF9zdHJpbmcoJHhtbCwgTlVMTCwgTElCWE1MX05PQ0RBVEEpOwogICAgeG1sX2V4cGFuZF9hdHRyaWJ1dGVzKCRvYmpYbWwpOyAvLyDlsZ7mgKfjgpLlsZXplovjgZnjgosKICAgICRqc29uID0ganNvbl9lbmNvZGUoJG9ialhtbCwgSlNPTl9QUkVUVFlfUFJJTlQgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJy9cXFxcXC8vJywgJy8nLCAkanNvbik7IC8vICJcLyIg4oeSICIvIiDjgavnva7mj5sKfQoKZnVuY3Rpb24geG1sX2V4cGFuZF9hdHRyaWJ1dGVzKCRub2RlKQp7CiAgICBpZigkbm9kZS0+Y291bnQoKSA+IDApIHsKICAgICAgICBmb3JlYWNoKCRub2RlLT5jaGlsZHJlbigpIGFzICRjaGlsZCkKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2goJGNoaWxkLT5hdHRyaWJ1dGVzKCkgYXMgJGtleSA9PiAkdmFsKSB7CiAgICAgICAgICAgICAgICAkbm9kZS0+YWRkQ2hpbGQoJGNoaWxkLT5nZXROYW1lKCkuIkAiLiRrZXksICR2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhtbF9leHBhbmRfYXR0cmlidXRlcygkY2hpbGQpOyAvLyDlho3luLDlkbzlh7oKICAgICAgICB9CiAgICB9Cn0KPz4=
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