XML使用总结(二)

XML使用总结(二):

·     命名空间?

·     编码解析?

·     数据存储?

·     服务器端?

·     涉及技术?

 

一、命名空间

命名空间(namespace)是用来解决或区分不同文档使用同样元素冲突的问题,因为XML编译器无法区分该编译哪个文档。

 

1、名字冲突

文档1:

    <product>

       <id>1001</id>

       <no>NOC0001</no>

        <name>PHP高级设计教程</name>

       <price>88.99</price>

        <time>2015.12.30</time>

    </product>

文档2:

    <product>

        <id>10001</id>

        <no>MSC0001</no>

        <name>韩国料理 </name>

        <price>128.99</price>

       <time>2015.04.30</time>

    </product>

 

正如上面的两个文档,它们使用同样的元素分别描述了书籍和美食,如果它们同时使用的话,编译器无法确认如何处理这类名字冲突,就会发生问题。

 

2、前缀命名

针对上面的问题,我们可以使用前缀命名来区分两个文档的元素,使编译器能够编译解析,区分对应的XML文档,可如下设置:

文档1:

    <book:product>

        <book:id>1001</id>

        <book:no>NOC0001</no>

        <book:name>PHP高级设计教程</name>

        <book:price>88.99</price>

        <book:time>2015.12.30</time>

    </book:product>

文档2:

    <food:product>

        <food:id>10001</id>

        <food:no>MSC0001</no>

        <food:name>韩国料理 </name>

        <food:price>128.99</price>

        <food:time>2015.04.30</time>

    </product>

 

NOTE:

实际上,前缀命名构造了新的文档描述元素,也就是通过一种前缀办法,区分了两个文档中的相同元素标记。

 

3、命名空间

命名空间的语法:

xmlns:namespace-prefix= "namespaceURI"

 

注:当命名空间定义在元素的开始标签,那么所有的相同前缀子元素标签都与该命名空间相关联。另外,默认命名空间只需要把namespace-prefix 去掉即可,即xmlns="namespaceURI"。那么上面的两个文档就可以设置为如下:

 

文档1:

    <product xmlns:book="http://www.nsbooks.com/books">

        <id>1001</id>

        <no>NOC0001</no>

        <name>PHP高级设计教程</name>

       <price>88.99</price>

       <time>2015.12.30</time>

    </product>

文档2:

    <product xmlns:food="http://www.nsfoods.com/foods">

        <id>10001</id>

        <no>MSC0001</no>

        <name>韩国料理 </name>

       <price>128.99</price>

       <time>2015.04.30</time>

    </product>

 

注:

我们推荐使用这种方式来定义区分同时使用的不同文档元素,它的优势在于元素的访问以及后期的维护等工作,变得更加简单。另外,namespaceURI为统一资源定位符,是一串可以唯一标志互联网上资源的标记,某些企业会将这个定义为一个可显示的页面,里面显示与该类命名空间相关的信息。

在很多语言中也使用了命名空间的,如Android布局文件XML:

xmlns:android="http://schemas.android.com/apk/res/android"

 

二、编码解析

1、XML编码

在文档方面,编码问题一直都有关注,在XML中的编码问题主要出现在:

A、文档未指定编码,在平台移植XML或是编辑器编辑保存导致乱码;

B、文档编辑器编码,如果文档的编码与编辑器的编码不同,很容易发生编码不一致的问题,导致乱码或是解析出现问题。

 

NOTE:

一点建议:

·     文档添加编码格式

·     确认编辑器的编码

·     使用有编码编辑器

·     保证文档和编辑器编码相同

 

2、避免解析

我们知道,默认XML文档中内容都会被解析器解析,但有时候某些内容我们不希望被解析,那么我们可以使用CDATA标记告诉解析器,在我的庇护区段内容不需要您解析。它的语法结构如下:

<![CDATA[

   text_statement

]]>

注:

CDATA 部分不能包含字符串"]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

 

也就是,text_statement部分被CDATA保护,不被XML解析器解析。在实际使用时,很多语言代码,例如Java、PHP及JavaScript等,都包含大量的"<"和"&"符号,而我们也知道,在XML中使用这些字符是不允许的,虽然可以使用实体引用来替换,但是这种方式不是很方便,也不利于维护。

 

我们结合上一篇文章的例子来说明CDATA的使用:

XML文档如下:

<producttype>

    <product category="PHP">

        <id>1001</id>

        <no>NOC0001</no>

        <name>PHP高级设计教程</name>

       <price>88.99</price>

       <time>2015.12.30</time>

       <discount><![CDATA["7折"]]></discount>

    </product>

    <product category="JAVA">

        <id>1002</id>

        <no>NOC0002</no>

        <name>JAVA高级开发教程</name>

       <price>102.99</price>

       <time>2004.03.30</time>

        <discount>if 1 &lt;2 then "7折";</discount>

    </product>

    <product category="WEB">

        <id>1003</id>

        <no>NOC0003</no>

        <name>WEB高级开发教程</name>

        <price>78.99</price>

       <time>2012.07.30</time>

       <discount><script><![CDATA[matchdis = function(p){

            if(p >= 0 && p< 2) return "9折";}]]></script>

        </discount>

    </product>

</producttype>

 

我们对上面的XML文档解析,结果:

从上图分析,我么可以看到使用了CDATA之后,XML解析器并未对里面的内容进行解析。

 

NOTE:

一般情况下,CDATA常用在XHTML兼容处理,以及处理在XML中嵌入代码段,限制解析器解析保护的内容,留给其它程序处理该内容。

 

三、数据存储

XML描述文件可作为文本数据存储的方式,因为它的跨平台一致性较高,并且数据不需要格式转换。在实际使用中,我们经常看到很多配置信息,或是量少的数据通过XML存储,但是在大数据保存时,我们还是要使用数据库的,我们需要针对具体的需求而选择何时的存储方式。

 

下面我们举个例子,来说明XML怎样构建,数据如何存储到XML中,以及如何解析查看。我们之前在JavaScript中通过DOM解析XML,接下来我们在另一种语言PHP中去生成和解析XML,在PHP默认支持XML的DOM解析器,具体如下(这里使用了PHP开源框架ThinkPHP):

1、PHP代码(生成XML)

<?php

$dom = new \DOMDocument('1.0','utf-8');

           

            // root element

            $root =$dom->createElement('producttype');

            $element =$dom->appendChild($root);

            // child element

            $product =$dom->createElement('product');

            $product->setAttribute('category','PHP');

            $element->appendChild($product);

            $eleId =$dom->createElement('id','1001');

            $product->appendChild($eleId);

            $eleNo =$dom->createElement('no','NOC0001');

            $product->appendChild($eleNo);

            $eleName =$dom->createElement('name','PHP高级设计教程');

            $product->appendChild($eleName);

            $elePrice =$dom->createElement('price','88.99');

            $product->appendChild($elePrice);

            $eleTime =$dom->createElement('time','2015.12.30');

            $product->appendChild($eleTime);

           

            $product =$dom->createElement('product');

            $product->setAttribute('category','JAVA');

            $element->appendChild($product);

            $eleId =$dom->createElement('id','1002');

            $product->appendChild($eleId);

            $eleNo =$dom->createElement('no','NOC0002');

            $product->appendChild($eleNo);

            $eleName =$dom->createElement('name','JAVA高级开发教程');

            $product->appendChild($eleName);

            $elePrice =$dom->createElement('price','102.99');

            $product->appendChild($elePrice);

            $eleTime =$dom->createElement('time','2004.03.30');

            $product->appendChild($eleTime);

           

            $product =$dom->createElement('product');

            $product->setAttribute('category','WEB');

            $element->appendChild($product);

            $eleId =$dom->createElement('id','1003');

            $product->appendChild($eleId);

            $eleNo =$dom->createElement('no','NOC0003');

            $product->appendChild($eleNo);

            $eleName =$dom->createElement('name','WEB高级开发教程');

            $product->appendChild($eleName);

            $elePrice =$dom->createElement('price','78.99');

            $product->appendChild($elePrice);

            $eleTime =$dom->createElement('time','2012.07.30');

            $product->appendChild($eleTime);

           

            // save document

            $dom->formatOutput = true;

            $msg = $dom->save('product_save.xml');

?>

 

结果生成的XML文件,上一篇的文档完全相同:

<?xml version="1.0" encoding="utf-8"?>

<producttype>

  <product category="PHP">

    <id>1001</id>

    <no>NOC0001</no>

    <name>PHP高级设计教程</name>

    <price>88.99</price>

   <time>2015.12.30</time>

  </product>

  <product category="JAVA">

    <id>1002</id>

    <no>NOC0002</no>

    <name>JAVA高级开发教程</name>

    <price>102.99</price>

   <time>2004.03.30</time>

  </product>

  <product category="WEB">

    <id>1003</id>

    <no>NOC0003</no>

    <name>WEB高级开发教程</name>

   <price>78.99</price>

   <time>2012.07.30</time>

  </product>

</producttype>

 

2、PHP代码(解析XML)

<?php

$dom = new \DOMDocument('1.0','utf-8');

            // 加载

            $dom->load('product_save.xml');

            // 遍历

            $items =$dom->getElementsByTagName('product');

            echo $items;

            foreach($items as$item) {

                  echo $item->nodeValue.'</br>';

            }

?>

 

打印的结果:

从上图可看出,结果与上一篇文章结果相同。好了,XML数据存储就到这,接下来看下服务端XML的处理。

 

四、服务器端

XML是一种描述文件,可以独立的存放在本机或是服务器端,在本篇文章的第三部分已经使用PHP生成了XML文档,并对其进行解析,同时生成的文档也以文件的形式存放在服务端;而有的时候,我们也会将数据库中读取的数据,写入XML描述问价并返回前端显示,其实过程就是数据库读取数据,然后将数据转换为XML格式,返回给前端,前端获得之后再对XML进行解析并显示,这就是现阶段最为常用的XML使用情景。

 

五、涉及技术

这里罗列的是与XML相关的技术列表:

1、XML DOM

访问和操作XML的标准文档模型。

 

2、DTD

用来定义XML文档中合法元素格式的标准。

 

3、XSLT

XSLT主要用来将XML转换为其它格式的工具,它包含三个部分:

XSLT:把XML转为其它格式的数据;

XSL-FO:格式化XML文档语言;

XPath:在XML文档中导航的语言;

 

 

 

好了,到这里我们已经总计介绍了XML的命名空间、CDATA、编码、服务端使用等内容,如有问题请及时讨论学习,谢谢。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值