您现在的位置是:首页 > 文章详情  网站首页文章详情

php内置方法解析xml数据

  • Administrator
  • 290
  • 2020-04-27 21:34:00
简介说明 我的xml数据是一个文件,就是导出的cnblogs的博客文件。 下面使用php内置的三种方式,解析它,并没有使用安装包。因为我是用的laravel框架的调试的,所以里...

说明

我的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[" 开始,由 "]]>" 结束: 例如这样:

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

在上面的例子中,解析器会忽略 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);
}

文章评论

Top