最近处理一些配置文件, 碰到了 YAML 格式的文件, 因为之前没接触过此格式的文件, 对于 xml 还比较熟悉一些. 那么什么是 YAML 呢? 它相比 xml 又有哪些优缺点呢? 什么情况下用 YAML 呢? YAML 怎么使用呢? 在此做一个简单的总结吧. 咱们就先从 xml 来说吧.
相信 xml 大家都比较熟知吧. 下面是我从网络上摘取的概念性的东西, 大家可以看一下. 在此就不多说了. 更多的说一些基本用法.
xml 概述: 可扩展标记语言 (Extensible Markup Language, xml) , 用于标记电子文件使其具有结构性的标记语言, 可以用来标记数据, 定义数据类型, 是一种允许用户对自己的标记语言进行定义的源语言. xml 是标准通用标记语言 (SGML) 的子集, 非常适合 web 传输. xml 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.
格式特性:
xml 与 Access,Oracle 和 SQL Server 等数据库不同, 数据库提供了更强有力的数据存储和分析能力, 例如: 数据索引, 排序, 查找, 相关一致性等, xml 仅仅是存储数据. 事实上 xml 与其他数据表现形式最大的不同是: 它极其简单, 这是一个看上去有点琐细的优点, 但正是这点使 xml 与众不同.
xml 与 html 的设计区别是: xml 被设计为传输和存储数据, 其焦点是数据的内容. 而 HTML 被设计用来显示数据, 其焦点是数据的外观. HTML 旨在显示信息, 而 xml 旨在传输信息.
xml 和 HTML 语法区别: HTML 的标记不是所有的都需要成对出现, xml 则要求所有的标记必须成对出现; HTML 标记不区分大小写, xml 则大小敏感, 即区分大小写.
读写:
xml 读写我所熟悉的有两种方式, 一种是通过 JavaScript 来获取 xml 值, 一个是用 PHP 来读取. xml 的编写大家可以参考着手册, xml 格式比较自由, 可以自定义标签, 但有一个原则就是要直观. 下面直接列举出示例供大家测试, 如有问题大家可以交流.
note.xml
代码如下:
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <note>
- <from>John</from>
- <to>George</to>
- <message>Don't forget the meeting!</message>
- </note>
xml_test.HTML
JavaScript
代码如下:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <HTML xmls="http://www.w3.org/1999/xhtml">
- <body>
- <p>
- <b>
- To:
- </b>
- <span id="to">
- </span>
- <br />
- <b>
- From:
- </b>
- <span id="from">
- </span>
- <br />
- <b>
- Message:
- </b>
- <span id="message">
- </span>
- </p>
- <script type="text/javascript">
- if (Windows.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
- xmlhttp = new XMLHttpRequest();
- } else { // code for IE6, IE5
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- xmlhttp.open("GET", "note.xml", false);
- xmlhttp.send();
- xmlDoc = xmlhttp.responseXML;
- document.getElementById("to").innerHTML = xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
- document.getElementById("from").innerHTML = xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
- document.getElementById("message").innerHTML = xmlDoc.getElementsByTagName("message")[0].childNodes[0].nodeValue;
- </script>
- </body>
- </HTML>
xml_test.PHP
代码如下:
- <?PHP
- // 创建 DOM 对象
- $xml = new DOMDocument();
- // 读取 xml 文件
- $xml = simplexml_load_file('note.xml');
- // 输出 xml 文件中 from 属性, 多个相同属性也就是数组的形式, 可以用下标来取值
- echo $xml->from;
- ?>
YAML 简介:
YAML 作为一种比 xml 更为简单易读的序列化语言, 正越来越多地被用于应用及配置文件的开发中. 本文将简单介绍 YAML 的现状, YAML 与 xml 相比的优劣势, 并通过实际的例子给出 YAML 的典型应用场景及其使用方法 (涵盖 c/c++,Ruby,PHP 等).
优势:
YAML 的可读性好.
YAML 和脚本语言的交互性好.
YAML 使用实现语言的数据类型.
YAML 有一个一致的信息模型.
YAML 易于实现.
上面 5 条也就是 xml 不足的地方. 同时, YAML 也有 xml 的下列优点:
YAML 可以基于流来处理;
YAML 表达能力强, 扩展性好.
总之, YAML 试图用一种比 xml 更敏捷的方式, 来完成 xml 所完成的任务.
更多的内容及规范参见 http://www.yaml.org.
语法:
Structure 通过空格来展示. Sequence 里的项用 "-" 来代表, Map 里的键值对用 ":" 分隔.
这几乎就是所有的语法了.
比如......
一般 YAML 文件扩展名为. YAML. 比如: john.YAML
代码如下:
- name: John Smith
- age: 37
- spouse:
- name: Jane Smith
- age: 25
- children:
- - name: Jimmy Smith
- age: 15
- - name: Jenny Smith
- age 12
John 今年 37 岁, 有一个幸福的四口之家. 两个孩子 Jimmy 和 Jenny 活泼可爱. 妻子 Jane 年轻美貌.
如果深入研究的话还可能发现一些社会问题 ^_^.
可见 YAML 的可读性是不错.
读写:
PHP 对于 YAML 的读写, 我推荐使用 Spyc 类读写 YAML 文件.
Spyc 类文件下载地址:
https://github.com/mustangostang/spyc/
Spyc 只有 2 个类方法可供使用, 一个是读取 YAML 文件, 一个是生成 YAML 文件格式. 下面从这个两种方法介绍下.
代码如下:
- include('spyc.php');
- // 读取 YAML 文件, 生成数组
- $YAML = Spyc::YAMLLoad('spyc.yaml');
- // 将数组转换成 YAML 文件
- $array['name'] = 'andy';
- $array['site'] = '21andy.com';
- $YAML = Spyc::YAMLDump($array);
PHP.INI 读取 INI 的解析方式那种配置没法支持多维数组, So, 我对 YAML 生成多维数组很感兴趣, 主要想做一下配置文件, 如下:
代码如下:
- { row: 0, col: 0, func: {tx: [0, 1]} }
转为 PHP 多维数组如下:
test.YAML(这个例子是我的 DB 配置文件, 强烈推荐使用!)
代码如下:
- DB:
- default:
- dsn: 'mysql:dbname=test;host=127.0.0.1'
- user: 'root'
- pass: '111'
- session:
- dsn: 'mysql:dbname=test;host=127.0.0.1'
- user: 'root'
- pass: '111'
test.PHP
代码如下:
- <?PHP
- include('spyc.php');
- // 读取 YAML 文件, 生成数组
- $YAML = Spyc::YAMLLoad('test.yaml');
- echo "<pre>";
- print_r($YAML);
- echo "</pre>";
- PHP code
- Array
- (
- [DB] => Array
- (
- [default] => Array
- (
- [dsn] => MySQL:dbname=test;host=127.0.0.1
- [user] => root
- [pass] => 111
- )
- [session] => Array
- (
- [dsn] => MySQL:dbname=test;host=127.0.0.1
- [user] => root
- [pass] => 111
- )
- )
- )
PHP 生成 YAML 文件示例:
- <?PHP
- include('spyc.php');
- // 将数组转换成 YAML 文件格式
- $array['name'] = 'PHP 程序猿的笔记';
- $array['site'] = 'www.songchaoke.cn';
- $YAML = Spyc::YAMLDump($array);
- // 将转换的 YAML 写入到文件中
- $f = fopen('test2.yaml',"w+");
- fwrite($f,$YAML);
- fclose($f);