前言

一直想系统性的学XML,就没时间学,今晚抽出几个小时时间学完了XML。过几天再过来看看,背一背应该就差不多,记得东西较多,没什么难理解的。

XML数据传输格式

第一章 XML概述

1.1 引入

当我们看到 XML 标准突飞猛进的开发进度,以及大批的软件开发商采用这个标准的日新月异的速度时,真的是不禁感叹这真是令人叹为观止。

目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML。

XML 无所不在。XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

XML的主要用途有哪些?

1.程序之间的数据传输通讯(可以是跨语言传输)

2.配置文件config.xml

3.存储数据,充当小型数据库

优势:

规范数据格式,是数据具有结构性,易读易处理

1.2 什么是XML

XML 指可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据;XML 需要自行定义标签,且标签名称具有自我描述性;XML 是 W3C 推荐的数据传输存放标准。

XML和HTML的区别?

1.html标签不能自定义,XML只能自定义标签。

2.html语法要求不严格,xml对于语法的要求非常严格,标签必须是闭合的。

3.XML 被设计用来传输和存储数据,其焦点是数据内容;HTML 被设计用来显示数据,其焦点是数据的外观呈现。

第二章 XML的基本语法

2.1 语法规则

1.XML 文档必须有根元素,根元素是所有其他元素的父元素。

2.XML声明语句是可选部分,如果存在需要放在文档的第一行

所谓的文档声明就是告诉解析器当前文档格式、版本号以及编码格式。

3.所有的 XML 元素都必须是成对闭合标签;非闭合标签是非法的,解析器将报错,不无正常解析.

4.XML 标签对大小写敏感,必须头尾标签一致。

5.XML标签不允许有交叉嵌套,也就是父子标签关系不能交叉嵌套。

6.XML标签名不要使用特殊字符,尽量只用数字字母下划线。

7.XML 中的注释与HTML中注释一个语法格式。

8.实体引用 & 特殊字符

在 XML 中,一些字符拥有特殊的意义,如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始<age>46 < 100 </age>这样会产生 XML 错误;

为了避免错误,要用实体引用来代替特殊字符,格式与HTML中的实体字符用法一样

实体引用 实体字符 含义
&lt < 小于-less than
&gt > 大于-greater than
&amp & 与--ampersand
&apos ' 单引号-apostrophe
&quot " 双引号-quotation mark

2.2 元素属性

XML 元素中,可以随意添加一个或多个属性,前提是

属性值一定要用引号(单引号或双引号)引起来

属性名称的命名规范与元素的命名规范相同

元素中的属性是不允许重复的

属性也是用来存储数据信息的但实际开发经验是 在HTML中,属性用起来很便利,而在 XML 中,应该尽量避免使用属性,原因是

1.一个属性不能包含多个值(元素可以)

2.属性值不能是结构化数据(元素可以)

3.属性不容易扩展(为未来的变化)

4.属性难以阅读和维护。

总结:将数据放在属性中和放在子元素中,目的都是为了传输数据,而子元素更加容易被解析,更好维护,更便于引用。

2.3 CDATA

要处理大量特殊字符时,不能再用实体引用来处理了(主要是太麻烦,工作量大)可以使用CDATA将数据包裹就可以按原格式输出。

格式:<test><![CDATA[第一题题1:已知 c<4,d>5,问:c和d那个更好看? ]]> </test>

实体引用和CDATA的使用时机:

1.对于内容比较少的情况,可以使用实体引用对特殊字符进行直接替换操作。

2.对于内容比较多的情况,建议采用CDATA区段。

第三章 使用PHP解析XML文档

在PHP5版本以后,其提供了一个非常非常强大的类库,SimpleXML类库,专门用于实现对XML文档的解析操作。PHP中使用这个类库来处理XML数据。

3.1 XML解析原理

XML在解析时一共要经历三个步骤:

  1. 读取XML文档到内存

2.形成DOM树结构(DOM树可以简单理解文档的父子结构)

3.生成SimpleXML对象

3.2 SimpleXML类库

语法:simplexml_load_file('test.xml');

<?xml version="1.0" encoding="UTF-8"?>
<user>
<man>
<name>aklman</name>
<age>20</age>
<sex>男</sex>
</man>
<man sex="男">
<name>ak</name>
<age>22</age>
</man>
</user>
$xml=simplexml_load_file('test.xml');//引入文件并读取
var_dump($xml);//输出,输出个格式就是一个对象

1.如果当前读取的节点是对象就通过->来进行访问;

2.如果当前读取的节点是数组就通过[]来进行访问;

3.3 遍历XML数据

1.foreach循环遍历

$xml=simplexml_load_file('test.html);
foreach($xml->man as $v){
echo 'Name:'.$v->name.'Age:'.$v->age.'<br>';
}

2.for循环遍历

$xml=simplexml_load_file('test.html);
$length=count($xml);
for($i=0;$i<$length;$i++){
echo $xml->man[$i]->name;
}

读取节点的属性时XML属性要加到父节点,PHP才能解析

$xml=simplexml_load_file('test.xml');
echo $xml->man[1]->attributes()->sex;
//attributes()方法是用来获取节点属性,
//内存中节点属性存放在attributes中,它是一个以为数组,可以使用attributes()方法获取

3.4 使用SImpleXML增加节点

$xml=simplexml_load_file('test.html);
$man=
//创建添加子节点
$man = $xml->addChild('man');
//为节点添加属性
$man->addAttribute('sex','女');
//创建添加子节点及节点值
$man->addChild('name','aklman');
$man->addChild('age','23');
var_dump($xml);//打印,已经添加到内存
$xml->asXML('test1.xml');//保存数据进XML文件,没有文件,则创建;

3.5 案例

查询手机归属地案例,数据来源聚合网

<form action="03.5.php" method="get">
<input type="text" name="num"><br>
<input type="submit" value="提交">
</form>
//接受前台提交的数据
$tel = $_GET['num'];
//组装请求地址
$url = 'http://v.juhe.cn/telephone/index?telephoneNumber='.$tel.'&dtype=xml&format=&key=810c3b2c488bc37d5f521196d8799a7211';//地址已经打乱了,需要从聚合网购买
//发送请求并接受返回的数据
$s = file_get_contents($url);
// echo $s; //打印返回的XML数据
//使用 simplexml_load_string 函数读入并解析XML数据
$xml = simplexml_load_string($s);
//找到并打印我们想要的数据
echo '归属省:'.$xml->result->place->city111.'<hr>';
echo '归属城市:'.$xml->result->place->city.'<hr>';

第四章 Xpath语言

4.1 概述

XPath是一门在 XML 文档中查找信息的语言,XPath可用来在 XML 文档中对元素和属性进行遍历。

4.2 使用及语法

使用注意事项:

1.使用绝对路径实现数据查询

$xml = simplexml_load_file('user.xml');
//按节点的绝对路径查找
$data = $xml->xpath('/user/man/name');//返回数组
foreach($data as $v){
echo $v.'<hr>';
}
/*
*如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径,
*绝对路径实现数据查询必须一级一级的查询下去,不能越级。
*/

2.使用相对路径实现数据查询

$xml = simplexml_load_file('user.xml');
//按节点的相对路径查找
$data = $xml->xpath('//name');//返回数组
foreach($data as $v){
echo $v.'<hr>';
}
/*
*如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
*/

3.使用*来匹配所有节点

$xml = simplexml_load_file('user.xml');
//匹配man节点下的所有元素节点。
$data = $xml->xpath('//man/*');//返回数组
foreach($data as $v){
echo $v.'<hr>';
}

4.使用[]方括号的形式来实现数据查询

$xml = simplexml_load_file('user.xml');
//匹配man节点下的最后一个节点。
$data = $xml->xpath('//man[last()]');//返回数组
var_dump($data);
echo $data[0]->name;
//man[1] : 获取第一个man元素
//man[last()]:获取最后一个man元素
//man[age > 200] :获取age>200的man节点
/*
*方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置
*默认从1开始,而last()函数则表示选择集中的最后一个元素,括号内还可以放置表达式
*/

5.使用属性来获取元素

$xml = simplexml_load_file('user.xml');
//匹配man节点下含有sex属性的节点。
$data = $xml->xpath('//man[@sex]');//返回数组
var_dump($data);
echo $data[0]->name;

参考资料

W3school
菜鸟教程
XML编程与应用教程(第2版)

XML学习笔记--背诵版的更多相关文章

  1. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  2. XML学习笔记

    XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...

  3. Java基础及JavaWEB以及SSM框架学习笔记Xmind版

    Java基础及JavaWEB以及SSM框架学习笔记Xmind版 转行做程序员也1年多了,最近开始整理以前学习过程中记录的笔记,以及一些容易犯错的内容.现在分享给网友们.笔记共三部分. JavaSE 目 ...

  4. XML学习笔记(四)-- 修饰XML文档的CSS

    标签(空格分隔): 学习笔记 XML为存储结构化数据提供了强大的方法,但是它没有提供关于数据如何显示地信息,(数据的结构与数据表示无关).可以使用CSS来控制XML文档中各元素的呈现方式. CSS语法 ...

  5. XML学习笔记(三) -- Schema

    标签(空格分隔): 学习笔记 Schema的格式 XML Schema文档是由元素.属性.命名空间和XML文档中的其他节点构成的. XML Schema有两种重要的Schema模型:Microsoft ...

  6. XML学习笔记(二)-- DTD格式规范

    标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...

  7. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  8. XML学习笔记之XML的简介

    最近,自学了一段时间xml,希望通过学习笔记的整理能够巩固一下知识点,也希望把知识分享给你们(描红字段为重点): XML(extensible Markup language):可扩展的标记语言,解决 ...

  9. Python之xml学习笔记

    XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...

随机推荐

  1. css3应用

    画出一个禁行标志 border-radius: 50%; width: 100px; height: 100px; border: 10px solid red; background: linear ...

  2. kubectl格式化输出和调试

    1.格式化输出 以特定的格式想终端输出详细信息,可以在 kubectl 命令中添加 -o  或者 -output 选项 输出格式 描述 -o=custom-columns=<spec> 使 ...

  3. Object.prototype.toString.call(obj).slice(8,-1)

    1.Object.prototype.toString() 该方法返回描述某个对象数据类型的字符串,如自定义的对象没有被覆盖,则会返回“[object type]”,其中,type则是实际的对象类型. ...

  4. 单独安装jenkins-没有tomcat

    这里讲解war包的安装:windows的msi版安装很简单,双击即可,不用讲 1.官网下载 2. 3.把war包放到java目录下 4. 5.安装完成后打开:127.0.0.1:8080 输入密码后会 ...

  5. python、anaconda、jupyter notebook、pycharm、spyder

    说明: 1.anaconda把任何东西都当做包来管理. 2.anaconda本省集成了python和conda.spyder.numpy等. 3.pip只用于python,conda可用于多种语言. ...

  6. CF-1066B-Heaters

    这题就是从1到n点进行遍历,对未加热的点找到最远的能加热到这个点的点,还是看代码讲吧 #include"bits/stdc++.h" using namespace std; co ...

  7. cesium入门示例-3dTiles加载

    数据转换工具采用cesiumlab1.5.17版本,转换后的3dTiles加载显示比较简单,通过Cesium.Cesium3DTileset接口指定url即可,3dTiles文件可与js前端代码放置一 ...

  8. [洛谷P2613] [模板] 有理数取余

    刷水题. 传送门 看似高精而非高精乃是此题最大亮点. 边读边取模技能get~ #include<cstdio> #define ll long long #define mod 19260 ...

  9. Java Design Patterns(2)

    1.Factory Design pattern 工厂设计模式的优点 (1)工厂设计模式提供了接口而不是实现的代码方法. (2)工厂模式从客户端代码中删除实际实现类的实例化.工厂模式使我们的代码更健壮 ...

  10. java虚拟机的运行原理

    一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...