首页

xml的详细介绍

kkcode
2018-04-16  阅读 130

特点

  • xml重要性:非常重要。
    • 是因为其是计算机世界的通用语言。
    • 是我们学习Ajax和webservice的基础,是服务器之间交换数据常用的语言。

xml发布,其目的是想替换掉html,为甚么要替换掉HTML?

答:因为HTML中的信息,既有显示效果,如h2,h1标签,又有数据信息。 给数据的交换,解析,带来极大不变。

xml一般使用在什么地方?

答: 数据传输,配置文件等。

xml与HTML的重要不同之处?

  1. 显示、数据分离(最重要的区别)
  2. 标签的自描述性。 解释:HTML中,h1,h2都是规定好的。 xml中的标签是自己命名的,因此名称就可以说明数据的性质。 所以叫“自描述性”
<td>刘备</td><td>28</td>
<姓名>刘备<姓名><年龄>28<年龄>复制代码
  1. xml的语法及其严格,错误无法运行。

语法规范

  1. 如何声明一个xml文件 答:有两部分组成 声明部分
    <?xml version="1.0" encoding="utf-8"?>复制代码
    文档部分:由节点组成
    <节点名></节点名>复制代码

在xml中,节点/元素/标签 是一个意思。

  1. 标签的写法?

    答:标签成对出现且其区分大小写,进行闭合—(或自闭和单标签)。如:
    在xml标签中属性全小写。

  2. 整个文档只有一个跟节点。

  3. 标签可以嵌套,但是不能交叉嵌套。

  4. 属性的写法 属性必有值,推荐小写,属性值必须用双引号。

    <acquired selected="selected">今天下雪了</acquired>复制代码
  5. 注释的写法

<!-- 我是注释 -->复制代码
  1. 字符实体
&gt; &lt; &equt;(双引号) &apos;(单引号)复制代码

如果从数据库中取出大量字段包含>,<,',"该怎么办?

答:使用CDATA节点来表示

<article title="'小偷'进城&gt;">
        <![CDATA[**如果从数据库中取出大量字段包含>,<,',"该怎么办?**
答:使用CDATA节点来表示]]>
</article>复制代码
  1. 在xml里,一切都是节点,包括换行符,和空白都是文本节点.

解析与创建

一般的小偷程序:

  1. file_get_contents/curl -->页面的HTML
  2. 正则分析视频地址

缺点:

  1. 慢,HTML页面比较大,有大量的信息是无用的
  2. 如果页面改版了,采集规则可能失效。

我们的采集办法: 利用土豆的api得到xml信息

  1. xml是纯数据,内容少,获取快
  2. 纯数据,比如标题,时长等,这些是不会变的,很难失效。

目前,各大网站都有自己的开放接口。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?

  1. 要把xml文件读入进来,形成一个xml文档对象,<--对应js-->document对象
  2. 再通过getElementsByTagName('标签名'),得到一组节点
  3. 再把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>复制代码

从最小的节点创建

  1. 先创建“天龙八部”文本节点
  2. 创建name节点
  3. 把“天龙八部”文本节点放入name节点中
  4. 创建cdata节点
  5. 创建intro节点
  6. 再把cdata节点放入intro节点中
  7. 创建goods节点
  8. 把name,intro放入goods节点中
  9. 创建属性节点goods_id
  10. 在把goods_id节点放入到goods中
  11. 创建appstore节点
  12. 把goods放入appstore节点中
  13. 在把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();
复制代码
本文为作者原创文章,转载无需和我联系,但请注明转载链接。 【前端黑猫】