php - 将 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)
请帮我。
解决方案
当您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); // 再帰呼出
}
}
}
推荐阅读
- javascript - 滚动页面时,圆形鼠标跟随正在移动
- linux - systemd 服务 - celery.platforms.LockFailed:[Errno 2] 没有这样的文件或目录:'/var/run/celery/worker1.pid'
- javascript - 根据条件从 JSON 读取管道值 - Angular
- regex - REGEXMATCH 如果没有则计数为零
- python - 使用 python 3 和 Gmail API 发送带有附件的电子邮件,我最终得到损坏的文件或 ConnectionAbortedError
- date - Mule 4 表达式在 url 中传递日期时间
- android - Multidex、Proguard 和 Firebase
- python - 搜索和插入 Python 字典的性能低下
- c++ - 使用对象名称中的变量调用方法
- javascript - 如何检查 NaN javascript 的相等性