zl程序教程

您现在的位置是:首页 >  前端

当前栏目

XML

XML
2023-06-13 09:12:15 时间

XML数据

XML:可扩展性标记语言 XML被发明的目的是,传输和存储数据,而不是展示数据 XML标签必须自定义,标签名要有含义,且标签有开有合(必须成对) 所有的XML必须有一个根节点,意思就是要有一个标签包含所有内容就像HTML的“html”标签,这个标签一般为“root”

主要用途:

  • 程序之间数据传输通讯
  • 充当配置文件,如多个语言开发项目的时候
  • 存放数据,充当小型数据库

特点:

  • 规范的数据格式
  • 数据具有结构性
  • 易读易处理

XML的编写格式

XML头声明,不强制声明 XML区分大小写 XML不能使用特殊字符,如大于小于等 如果要使用,必须用实体 &lt : < $gt :> &amp : & &apos : ' &quot : "

XML注释<!-- -->

如下格式

<?xml version='1.0' encoding='utf-8' ?>
<root>
<name>test</name>
<!-- 注释内容 -->
</root>

XML属性

描述其本身额外的信息 如 <age name='tangxiaohan'></age> 属性规则:一个标签可有多个属性 属性必须使用引号 命名规则与变量名规则差不多 不过属性用到的地方不多

XML不将数据解析 在有些时候我们可能要使用很多的特殊字符,但是你又不想使用类似于&lt的转义字符,这里我们就可以用“CDATA”数据区域 “CDATA”不会将区域内的内容解析 格式如下: <![CDATA[不解析的内容。。。]]>

<root>
    <user>托尔斯泰</user>
    <msg><![CDATA[托尔斯泰说如果1+1>2,那么2+2将>4]]></msg>
</root>

XML数据解析 解析XML文件

既然XML是一种数据传输格式,那我们PHP怎么解析这种数据? 在php5版本后,为我们提供了一个非常强大的类库,SilpmeXML专门用于实现XML文档的解析操作 使用函数simplexml_load_file(path); 解析XML文件,返回php对象

//xml
<root>
    <user>托尔斯泰</user>
    <msg><![CDATA[12423]]></msg>
</root>
//php
$res = simplexml_load_file('./test.xml');
print_r($res);

但这里我的测试结果好像不能解析CDATA的数据,如果是以xml文件格式存储的数据

php添加xml数据到xml文件

使用addChild方法,他有两个参数,第一个是添加的节点名,第二个可选添加的值 如:

$x = simplexml_load_file('test.xml')//要添加值到xml首先得解析xml文件
$man = $x->addChild('man');//添加一个man节点
$man->addChild('name','遇');
$man->addChild('age',20);//向man节点添加两个节点,这两个节点填充数据
$x->asXML('test.xml');//将添加的内容写入到xml文件

解析XML内容

要解析XML内容使用simplexml_load_string这个函数会解析xml字符串而不是具体文件 如

$txt="<root>
<name>test</name>
<!-- 注释内容 -->
</root>"
//
$res=simplexml_load_string($txt,'SimpleXMLElement',LIBXML_NOCDATA);

Xpath规则

Xpath是专门用来查找XML数据内容的一种规则 用来在XML文档中对元素及属性进行遍历 xpath(path)

查找语法

  • 绝对路径查找 如下XML数据
 <root>
    <man>
        <name>唐僧</name>
        <age>40</age>
    </man>
    <man>
        <name>孙悟空</name>
        <age>23</age>
    </man>
    <man>
        <name>猪八戒</name>
        <age>18</age>
    </man>
    <man>
        <name>沙悟净</name>
        <age>60</age>
    </man>
</root>

通过绝对路径查找man下所有的name

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('/root/man/name');
var_dump($res);

打印结果,返回数组类型

通过相对路径查找xml数据中所有的name

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//name');
var_dump($res);

使用通配符*查找man下面所有的节点内容

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man/*');
var_dump($res);
foreach ($res as $key => $value) {
    echo $value;
}

返回结果

条件查找

查找man节点的子节点age=40的数据

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[age=40]');
var_dump($res);

返回结果

返回数组类型,数组值为属性->值

其他查找

last()查找最后一个 返回值与条件查找的返回值一样

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[last()]');
var_dump($res);

数字查找

返回值与条件查找的返回值一样 如查找第二个

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[2]');
var_dump($res);

根据属性查找

查找man中有msg属性的记录

$xmlObj=simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA);
$res = $xmlObj->xpath('//man[@msg]');
var_dump($res);