将xml转换为json时,几个对象名称更改为“ @attributes”

时间:2018-10-19 03:40:43

标签: php json xml

我读了这篇文章。

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)

请帮助我。

1 个答案:

答案 0 :(得分:0)

当您json_encode()具有属性的XML时,这将创建您所获取的@attributes元素。解决此问题的唯一方法是在展开它们时将其删除。我已经更改了例程,第一件事是我首先处理属性的部分,这确保了根节点也得到处理。

最主要的是,我已经更改了使用XPath检索属性的方式,然后按需对其进行编码,但是还允许您从原始节点中删除属性(使用{{1} })...

unset($attribute[0]);