首页 > 解决方案 > 将 xml 转换为 json 时,几个对象名称更改为“@attributes”

问题描述

我读了这篇文章。

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)

请帮我。

标签: phpjsonxml

解决方案


当您json_encode()使用带有属性的 XML 时,这将创建@attributes您获得的元素。解决此问题的唯一方法是在扩展它们时将其删除。我改变了例程,第一件事是我把处理属性的部分放在第一位,这样可以确保根节点也得到处理。

主要的是我改变了使用 XPath 检索属性的方式,然后按照你的方式对它们进行编码,但也允许你从原始节点中删除属性(使用unset($attribute[0]);)...

function xml_expand_attributes($node)
{

    foreach ($node->xpath("@*") as $attribute) {
        $node->addChild($node->getName()."@".$attribute->getName(), (string)$attribute);
        unset($attribute[0]);
    }
    if($node->count() > 0) {
        foreach($node->children() as $child)
        {
            xml_expand_attributes($child); // 再帰呼出
        }
    }
}

推荐阅读