php内置方法解析xml数据
说明
我的xml数据是一个文件,就是导出的cnblogs的博客文件。
下面使用php内置的三种方式,解析它,并没有使用安装包。因为我是用的laravel框架的调试的,所以里面,会充斥着laravel语法。
获取方式
- 类的形式
$content = Storage::get('cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml'); $dom = new \SimpleXMLElement($content);
- 函数形式
$content = Storage::get('cnblogs/CNBlogs_BlogBackup_131_201904_202004.xml'); $dom = simplexml_load_string($content);
- 文件路径形式
$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[" 开始,由 "]]>" 结束:
例如这样:
<![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);
}