最近处理一些配置文件,碰到了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 (window.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);
[/code]