zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    DateTime类型的一个Bug
    无痛苦的软件维护——被遗忘的需求
    完全命令行.NET开发
    无痛苦的软件维护——文档和代码
    .NET初学者架构设计指南(一)Hello world的时代
    NGOSS的一点简单概念
    软件的逻辑层次
    VSTS for Testers学习笔记目录
    How Google Tests Software (出书,停止更新)
    推荐——《浪潮之巅》(据传稍后会出书,停止更新)
  • 原文地址:https://www.cnblogs.com/hxsen/p/12790357.html
Copyright © 2011-2022 走看看