php内置方法解析xml数据

Posted houxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php内置方法解析xml数据相关的知识,希望对你有一定的参考价值。

说明

我的xml数据是一个文件,就是导出的cnblogs的博客文件。
下面使用php内置的三种方式,解析它,并没有使用安装包。因为我是用的laravel框架的调试的,所以里面,会充斥着laravel语法。

获取方式

  1. 类的形式
    $content = Storage::get(\'cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml\');
    $dom = new \\SimpleXMLElement($content);
    
  2. 函数形式
    $content = Storage::get(\'cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml\');
    $dom = simplexml_load_string($content);
    
  3. 文件路径形式
    $dom = simplexml_load_file(storage_path(\'/app/cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml\'));
    

结果

这种解析的数据都是类的格式。如下所示:

SimpleXMLElement {#490 ▼
  +"@attributes": array:1 [▶]
  +"channel": SimpleXMLElement {#497 ▼
    +"title": "博客园-houxin"
    +"link": "https://www.cnblogs.com/hxsen/"
    +"description": SimpleXMLElement {#498}
    +"language": "zh-cn"
    +"lastBuildDate": "Mon, 27 Apr 2020 12:58:41 GMT"
    +"pubDate": "Mon, 27 Apr 2020 12:58:41 GMT"
    +"ttl": "60"
    +"item": array:23 [▼
      0 => SimpleXMLElement {#499 ▼
        +"title": "laravel框架简易对接网易163邮件"
        +"link": "http://www.cnblogs.com/hxsen/archive/2020/04/25/12773638.html"
        +"author": "houxin"
        +"pubDate": "Sat, 25 Apr 2020 08:33:00 GMT"
        +"guid": "http://www.cnblogs.com/hxsen/archive/2020/04/25/12773638.html"
        +"description": SimpleXMLElement {#524}
      }
      1 => SimpleXMLElement {#500 ▶}
      2 => SimpleXMLElement {#501 ▶}
      3 => SimpleXMLElement {#502 ▶}
    ]
  }
}

可以直接使用->函数获取。
建议直接使用就行了,不要再转换成数组形式了。折腾来折腾去,不仅麻烦,还行影响性能。关于对象的好处,请自行查询。都21世纪了,原油都跌成了负数了,还抱着老一辈学习的古老知识,觉得美美的,殊不知都过时了。

CDATA的说明

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
在 XML 元素中,"<" 和 "&" 是非法的。
"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。
"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。
某些文本,比如 javascript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "" 结束:
例如这样:

<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。
关于 CDATA 部分的注释:
CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。
更多说明,请参加w3c文档

CDATA的提取

如果读取cdata数据,转换为string即可。
一般的xml解析器,是自动忽略CDATA的解析的,但是并不是意味着,它不存在。

SimpleXMLElement {#491 ▼
  +"title": "laravel框架简易对接网易163邮件"
  +"link": "http://www.cnblogs.com/hxsen/archive/2020/04/25/12773638.html"
  +"author": "houxin"
  +"pubDate": "Sat, 25 Apr 2020 08:33:00 GMT"
  +"guid": "http://www.cnblogs.com/hxsen/archive/2020/04/25/12773638.html"
  +"description": SimpleXMLElement {#500}
}

description就是一个CDATA的值,它被解析成了SimpleXMLElement类。使用的时候,直接把它转成string即可。

$dom = simplexml_load_file(storage_path(\'/app/cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml\'));
foreach($dom->channel->item as $item){
    $content = strval($item->description);
}

以上是关于php内置方法解析xml数据的主要内容,如果未能解决你的问题,请参考以下文章

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

无法解析片段中的 findViewById [重复]

用代码解析PHP内置函数compact

php如何解析多级xml报文?

在java中解析xml有哪几种方法

java解析xml的几种方式哪种最好?