我读了这篇文章。
https://qiita.com/yasumodev/items/74a73ed4b3f1dd45edb8
我做了同样的事情。
// XML(RSSなど)を取得
$strXml = file_get_contents("./doc.xml");
// XML⇒JSONに変換
$strJson = xml_to_json($strXml);
// 出力
echo $strJson;
//**********************************
// XML ⇒ JSONに変換する関数
//**********************************
function xml_to_json($xml)
{
// コロンをアンダーバーに(名前空間対策)
$xml = preg_replace("/<([^>]+?):([^>]+?)>/", "<$1_$2>", $xml);
// プロトコルのは元に戻す
$xml = preg_replace("/_\/\//", "://", $xml);
// XML文字列をオブジェクトに変換(CDATAも対象とする)
$objXml = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
// 属性を展開する
xml_expand_attributes($objXml);
// JSON形式の文字列に変換
$json = json_encode($objXml, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
// "\/" ⇒ "/" に置換
return preg_replace('/\\\\\//', '/', $json);
}
//**********************************
// XMLタグの属性を展開する関数
//**********************************
function xml_expand_attributes($node)
{
if($node->count() > 0) {
foreach($node->children() as $child)
{
foreach($child->attributes() as $key => $val) {
$node->addChild($child->getName()."@".$key, $val);
}
xml_expand_attributes($child); // 再帰呼出
}
}
}
但是以这种方式,几个对象的名称更改为“ @attributes”。
我想要原始对象名称在这里(T_T)
请帮助我。
答案 0 :(得分:0)
当您json_encode()
具有属性的XML时,这将创建您所获取的@attributes
元素。解决此问题的唯一方法是在展开它们时将其删除。我已经更改了例程,第一件事是我首先处理属性的部分,这确保了根节点也得到处理。
最主要的是,我已经更改了使用XPath检索属性的方式,然后按需对其进行编码,但是还允许您从原始节点中删除属性(使用{{1} })...
unset($attribute[0]);