xml的详细介绍
特点
- xml重要性:非常重要。
- 是因为其是计算机世界的通用语言。
- 是我们学习Ajax和webservice的基础,是服务器之间交换数据常用的语言。
xml发布,其目的是想替换掉html,为甚么要替换掉HTML?
答:因为HTML中的信息,既有显示效果,如h2,h1标签,又有数据信息。 给数据的交换,解析,带来极大不变。
xml一般使用在什么地方?
答: 数据传输,配置文件等。
xml与HTML的重要不同之处?
- 显示、数据分离(最重要的区别)
- 标签的自描述性。 解释:HTML中,h1,h2都是规定好的。 xml中的标签是自己命名的,因此名称就可以说明数据的性质。 所以叫“自描述性”
<td>刘备</td><td>28</td>
<姓名>刘备<姓名><年龄>28<年龄>复制代码
- xml的语法及其严格,错误无法运行。
语法规范
- 如何声明一个xml文件
答:有两部分组成
声明部分
文档部分:由节点组成<?xml version="1.0" encoding="utf-8"?>复制代码
<节点名></节点名>复制代码
在xml中,节点/元素/标签 是一个意思。
标签的写法?
答:标签成对出现且其区分大小写,进行闭合—(或自闭和单标签)。如:
,
在xml标签中属性全小写。整个文档只有一个跟节点。
标签可以嵌套,但是不能交叉嵌套。
属性的写法 属性必有值,推荐小写,属性值必须用双引号。
<acquired selected="selected">今天下雪了</acquired>复制代码
注释的写法
<!-- 我是注释 -->复制代码
- 字符实体
> < &equt;(双引号) '(单引号)复制代码
如果从数据库中取出大量字段包含>,<,',"该怎么办?
答:使用CDATA节点来表示
<article title="'小偷'进城>">
<![CDATA[**如果从数据库中取出大量字段包含>,<,',"该怎么办?**
答:使用CDATA节点来表示]]>
</article>复制代码
- 在xml里,一切都是节点,包括换行符,和空白都是文本节点.
解析与创建
一般的小偷程序:
- file_get_contents/curl -->页面的HTML
- 正则分析视频地址
缺点:
- 慢,HTML页面比较大,有大量的信息是无用的
- 如果页面改版了,采集规则可能失效。
我们的采集办法: 利用土豆的api得到xml信息
- xml是纯数据,内容少,获取快
- 纯数据,比如标题,时长等,这些是不会变的,很难失效。
目前,各大网站都有自己的开放接口。application programing interface 应用程序接口
利用网站的api就可以查询信息。 例如:豆瓣的图书信息 土豆的api信息。
xml的dom解析
document.getElementsByTagName(); childNodes()
这两个方法是否有点熟悉?
答:是的,在js和Java中都有
为什么?
答: 因为xml是一种严格的文档格式,有其自身的标准。 解析xml,也有其规范,叫Dom标准。 我们所使用 的HTML,xml都遵循dom标准。 也就是为什么我们看到上面的两个函数那么熟悉。
因为无论是php还是Java,c,js解析dom树,都遵循dom标准。
如何通过php的dom对象,来解释xml?
- 要把xml文件读入进来,形成一个xml文档对象,<--对应js-->document对象
- 再通过getElementsByTagName('标签名'),得到一组节点
- 再把2步中得到的一组对象,取得其某一个,就得到了具体的节点。
例如解析02.xml的示例:
<!-- 02.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<title>天龙八部</title>
<price>28.8</price>
</book>
<book>
<title>笑傲江湖</title>
<price>27.2</price>
</book>
</bookstore>复制代码
// 1.创建dom解析对象
$dom = new DOMdocument('1.0','utf-8');
DOMdocument Object 有什么用?
答:他可以把xml文件加载入内存并分析,你就可以利用Object分析xml了。
// 2.载入xml文档进行分析
$dom->load('./02.xml');
// 3.得到title节点列表
分析得到是title节点列表对象
$ts = $dom->getElementsByTagName('title');
print_r($ts); // DOMNodelist
/*
DOMNodelist
有一个属性: length 代表取得的节点的数量
有一个方法: item(n) 代表取得第n个节点
*/
echo '我们得到了'. $ts.length .'个书名;
// 天龙八部。是一个文本节点,而且是<title></title>的子节点
$title0 = $ts->item(0);
print_r($title0->childNodes); // 打印结果,又是一个列表对象
$text = $title0->childNodes->item(0);
$bookName = $text->wholeText;
echo '我们得到的第一个书名是:'. $bookName;
echo '我们得到的第二个书名是:'. getElementsByTagName('title')->item(1)->childNodes->item(0)->wholeText;
echo '我们得到的第二个书名是:'. getElementsByTagName('title')->item(1)->nodeValue;
复制代码
用DOM创建xml文档
用DOM生成如下文档
<?xml version="1.0" encoding="UTF-8"?>
<appstore>
<!-- 属性也是节点 -->
<goods goods_id="g001">
<name>天龙八部</name>
<intro><![CDATA[这是一本好书&牛书]]></intro>
</goods>
</appstore>复制代码
从最小的节点创建
- 先创建“天龙八部”文本节点
- 创建name节点
- 把“天龙八部”文本节点放入name节点中
- 创建cdata节点
- 创建intro节点
- 再把cdata节点放入intro节点中
- 创建goods节点
- 把name,intro放入goods节点中
- 创建属性节点goods_id
- 在把goods_id节点放入到goods中
- 创建appstore节点
- 把goods放入appstore节点中
- 在把appstore节点放入文档中
上面步骤中,体现出:
创建普通节点
创建文本节点
创建CDATA节点
创建属性节点
添加到节点
// 创建DOM文档对象
$dom = new DOMdocument('1.0','utf-8');
// 创建文本节点
$tl = $dom->createTextNode('天龙八部');
// 创建普通节点
$name = $dom->createElement('name');
// 把天龙加到name节点中
$name->appendChild($tl);
// 创建cdata节点
$cdata = $dom->createCDATASection('这是一本好书&牛书');
// 创建intro节点
$intro = $dom->createElement('intro');
// 把cdata节点加入intro
$intro->appendChild($cdata);
// 创建goods节点
$goods = $dom->createElement('goods');
// 把name,intro节点加入goods节点
$goods->appendChild($name);
$goods->appendChild($intro);
// 创建属性节点goods_id
$attr = $dom->createAttribute('goods_id');
$attr->value = 'g001';
// 把属性节点加入goods
$goods->appendChild($attr);
// 创建appstore节点
$appstore = $dom->createElement('appstore');
// 把goods放入appstore节点中
$appstore->appendChild($goods);
// 在把appstore节点放入文档中
$dom->appendChild($appstore);
// 最后,可以输出也可以保存。
// savexml--->输出
header("content-type:text/xml"); // 告诉浏览器这是xml文件
echo $dom->savexml();
// save--->保存到当前目录下
$dom->save('tianlongbabu.xml');
复制代码
DOM节点的删除与修改
<!-- 03.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<appstore>
<goods goods_id="g001">
<name>天龙八部</name>
<intro><![CDATA[这是一本好书&牛书]]></intro>
</goods>
<goods goods_id="g002">
<name>倚天屠龙记</name>
<intro><![CDATA[倚天剑&屠龙刀]]></intro>
</goods>
</appstore>复制代码
// 创建dom对象
$dom = new DOMDocument('1.0','utf-8');
// 载入xml
$dom->load('./03.xml');
// 把天龙八部的商品删掉
// 查找第一个goods节点
$tl = $dom->getElementsByTagName('goods')->item(0);
// 删除第一个goods节点
$tl->parentNode->removeChild($tl);
// 查看结果
header('content-type:text/xml');
echo $dom->savexml();
// 修改节点,节点不能修改,只能替换
$name = $dom->getElementsByTagName('name')->item(0);
$text = $dom->createTextNode('七剑下天山');
$name->replaceChild($text,$name->firstChild);
header('content-type:text/xml');
echo $dom->savexml();
复制代码
本文为作者原创文章,转载无需和我联系,但请注明转载链接。 【前端黑猫】