1.xml基础概念

作用范围:

  1. 作为程序通讯的标准。
  2. 作为配置文件。
  3. 作为小型数据库。

xml语法:

<根标签>
<标签 元素="元素值" ...></标签>
...
<标签 元素="元素值" ...></标签>
</根标签>

xm的注意点

  • 必须有关闭标签
  • 对大小写敏感
  • 必须要正确的嵌套
  • 必须有根元素
  • 属性值必须加引号

2.CDATA节

概念:CDATA是不通过解析器进行解析的文本,文本中的标签不被看作标记。

注意:所有的资源都是二进制。是不能直接存在xml的,需要转义。或者使用CDATA

语法:<![CDATA[" 值 "]]>

<?xml version="1.0" encoding="UTF-8"?>
<!-- version="1.0" 声明用的xml版本是1.0
encoding="UTF-8"声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码 -->
<!--这是注释-->
<班级>
<stu stuNo="fdsafdsfdsf;" stuNo2="t-33">
<name>花花</name>
<age>20</age>
<介绍><![CDATA[eqre!@#¥%……&%¥#¥]]></介绍>
</stu>
</班级>

面试题:请问如果使用xml来保存及传递图片?

  答:使用程序先读到内存,然后保存到xml的<![CDATA[" 文件内容 "]]>(任何资源都是需要先读取到内存,)

3.处理指令PI(processing instruction)

classes1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- version="1.0" 声明用的xml版本是1.0
encoding="UTF-8"声明用xml传输数据的时候的字符编码,假如文档里面有中文,编码方式不是UTF-8,传输过去再解码的话中文就会是乱码 -->
<!--这是注释-->
<!-- 使用PI指令来引入css修饰 -->
<!-- 引入外部css -->
<?xml-stylesheet type="text/css" href="xmlcss.css"?>
<班级>
<stu stuNo="fdsafdsfdsf;" stuNo2="t-33">
<name>花花</name>
<age>20</age>
<介绍><![CDATA[eqre!@#¥%……&%¥#¥]]></介绍>
</stu>
</班级>

xmlcss.css

name{
font-size: 100px;
font-weight: bold;
color: red;
}
age{
font-size: 50px;
font-weight: bold;
color: blue;
}
介绍{
font-size: 20px;
font-weight: bold;
color: yellow;
}

界面显示:

4.文件约束DTD(document type definition)

常用约束:DTD、Schema

作用:dtd主要用处是约束html、xml、xhtml文件等。默认情况下浏览器不检测文件是否符合dtd,需要自己编写代码测试。

内部dtd:

  <!DOCTYPE 根元素名 [
           <!ELEMENT 元素名 (元素类型定义)>
       ]>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班级 [
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>]>
<班级>
<学生>
<名字>花花</名字>
<年龄>20</年龄>
<介绍>这是我的介绍</介绍>
<面积>555</面积>
</学生>
</班级>

外部dtd:

      <!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">(SYSTEM表示DTD文件是私有的。引号不能少)

<!-- 私有引用 -->
<!DOCTYPE 班级 SYSTEM "class2.dtd">
<!-- 公开引用 -->
<!DOCTYPE 根元素 PUBLIC "dtd的名称" "dtd文件的url">

dtd基本语法:

<!ELEMENT 元素名称 (子元素名称)>

+:1~多

?:0~1

*:0~多


DTD验证:写一个脚本去验证xml是否符合dtd约束

classes1.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd -->
<!DOCTYPE 班级 SYSTEM "class2.dtd">
<班级>
<学生>
<名字>花花</名字>
<年龄>20</年龄>
<介绍>这是我的介绍</介绍>
<面积>555</面积>
</学生>
<学生>
<名字>qq</名字>
<年龄>27</年龄>
<介绍>好好学习</介绍>
</学生>
</班级>

class2.dtd

<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>

test.html

<!DOCTYPE html>
<html>
<head>
<title>测试dtd</title>
<meta charset="utf-8" content="text/html;chatset=utf-8" />
<script language="javascript" >
// // 创建xml文档解析器对象
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
// 开启xml校验
xmlDoc.validateOnParse="true"
// 装载xml文档,即指定校验哪个XML文件
xmlDoc.load("classes1.xml") document.write("<br>Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br>Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br>Error Line: ")
document.write(xmlDoc.parseError.line)
</script>
</head>
</html>

结果:

dtd属性

语法:<!ATTLIST 元素名称 属性名称 属性类型 默认值>

5.XML编程

php dom :文档对象模型(document object moudle)

1.查看xml中内容

classes1.php

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd -->
<!DOCTYPE 班级 SYSTEM "class2.dtd">
<班级>
<学生 >
<名字>花花</名字>
<年龄>20</年龄>
<介绍>这是我的介绍</介绍>
</学生>
<学生>
<名字>qq</名字>
<年龄>27</年龄>
<介绍>好好学习</介绍>
</学生>
<班长>我</班长>
</班级>

phpdom.php

<?php
// 1.创建dom解析器
$xml=new DOMDocument();
//2.加载xml文件
$xml->load("classes1.xml");
// 3.获取所有学生
$stus=$xml->getElementsByTagName("学生");
for ($i=0; $i <$stus->length ; $i++) {
$stu=$stus->item($i);
echo getnodeval($stu,"名字")."----".getnodeval($stu,"年龄").getnodeval($stu,"介绍")."<br/>";
}
function getnodeval($mynode,$tagname){
return $mynode->getElementsByTagName($tagname)->item(0)->nodeValue;
}
?>

2.使用php增加xml中的内容

<?php
// 1.创建dom解析器
$xml=new DOMDocument();
//2.加载xml文件
$xml->load("classes1.xml");
// 3.添加一个学生信息
// 3.1 得到根节点
$root=$xml->getElementsByTagName("班级")->item(0);
// 3.2创建学生节点
$stu_node=$xml->createElement("学生");
// 3.2在创建名字节点
$stu_node_name=$xml->createElement("名字");
$stu_node_name->nodeValue="菜菜";
// 把名字节点挂载到“学生”节点下
$stu_node->appendChild($stu_node_name);
// 3.3 创建年龄节点
$stu_node_age=$xml->createElement("年龄");
$stu_node_age->nodeValue="18";
$stu_node->appendChild($stu_node_age);
// 3.4 创建介绍节点
$stu_node_inrto=$xml->createElement("介绍");
$stu_node_inrto->nodeValue="cmf";
$stu_node->appendChild($stu_node_inrto);
// 4.把学生节点挂在到根节点
$root->appendChild($stu_node);
//重新保存xml
$xml->save("classes1.xml");
?>

3.删除xml中的内容(注意:必须要重新保存。不然修改的内容在内存中改变了,但文件中的内容没有改变

<?php
// 1.创建dom解析器
$xml=new DOMDocument();
//2.加载xml文件
$xml->load("classes1.xml");
// 3.添加一个学生信息
// 3.1 得到根节点
$root=$xml->getElementsByTagName("班级")->item(0);
//3.2找到要删除的学生,比如第二个学生
$stus=$xml->getElementsByTagName("学生");
$stu=$stus->item(1);
// 4.删除第二个学生,将第二个学生的节点从根节点移除
// 方法一*********************
// $root->removeChild($stu);
// 方法二(不依赖根节点,直接通过父节点去删除)*********************
$stu->parentNode->removeChild($stu);
$xml->save("classes1.xml");
?>

4.更新xml中的内容

<?php
// 1.创建dom解析器
$xml=new DOMDocument();
//2.加载xml文件
$xml->load("classes1.xml");
//更新步骤
//1.找到要修改的节点
//2.重新赋值
$stus=$xml->getElementsByTagName("学生");
$stu1=$stus->item(0);
$stu1_age=$stu1->getElementsByTagName("年龄")->item(0);
// 给这个学生的年龄+10
$stu1_age->nodeValue+=10;
//保存文件
$xml->save("classes1.xml");
?>

翻译词条例题:

index.php(主界面)

<!DOCTYPE html>
<html>
<head>
<title>翻译</title>
</head>
<body>
<img src="ciba.png" width="200" height="100">
<form action="res.php" method="post">
<h1>查询单词</h1>
请输入你要翻译的内容:&nbsp;&nbsp;<input type="text" name="cont">
<input type="hidden" name="type" value="sel">
<input type="submit">
</form>
<form action="res.php" method="post">
<h1>增加单词</h1>
请输入汉语:&nbsp;&nbsp;<input type="text" name="chcont"></br></br>
请输入英文:&nbsp;&nbsp;<input type="text" name="encont"></br></br>
<input type="hidden" name="type" value="add">
<input type="submit">
</form>
</body>
</html>

caba.xml(xml信息,存取数据)

<?xml version="1.0" encoding="UTF-8"?>
<words>
<word>
<en>buy</en>
<ch>买</ch>
</word>
<word>
<en>hello</en>
<ch>你好</ch>
</word>
<word>
<en>go</en>
<ch>走</ch>
</word>
</words>

res.php(结果页面)

 <?php
//接收类型
$type=$_POST['type'];
echo $type;
//创建dom解析器
$xml=new DOMDocument();
//加载xml文件
$xml->load("ciba.xml");
// 判断类型
if ($type=="sel") {
$enwords=$_POST['cont'];
// 获取word节点
$words=$xml->getElementsByTagName("words")->item(0)->getElementsByTagName("word");
$flag=false;
for ($i=0; $i <$words->length ; $i++) {
$word=$words->item($i);
$xmlword=getvalue($word,"en");
if ($enwords==$xmlword) {
echo $enwords."对应的汉语翻译为".getvalue($word,"ch")."</br>";
$flag=true;
}
}
if (!$flag) {
echo "没有对应的词条"."</br>";
}
}elseif ($type=="add") {
$enword=$_POST["encont"];
$chword=$_POST["chcont"];
// 找到根节点,创建word节点,将word节点挂在到根节点上
$words=$xml->getElementsByTagName("words")->item(0);
$word_node=$xml->createElement("word");
$words->appendChild($word_node);
// 创建en节点,为en节点赋值。将en节点挂在到word节点上
$en_node=$xml->createElement("en");
$en_node->nodeValue=$enword;
$word_node->appendChild($en_node);
// 创建ch节点,为ch节点赋值。将ch节点挂在到word节点上
$en_node=$xml->createElement("ch");
$en_node->nodeValue=$chword;
$word_node->appendChild($en_node);
// 将修改的内容保存到xml中
$xml->save("ciba.xml");
echo "添加成功";
}
function getvalue($mynode,$word){
return $mynode->getElementsByTagName($word)->item(0)->nodeValue;
}
echo "<br/><br/><a href='index.php'>返回主界面</a>";
?>

界面展示:

6.xpath(是一种标识节点位置的语言,用来描述xml元素的位置)

xpath的设计核心思想:可以通过xpath迅速简捷的定位你希望查找的节点(不能增删改)

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<aaa>
<bbb/>
<ccc/>
<bbb/>
<ddd>
<bbb/>
</ddd>
<ccc/>
</aaa>

test.php

<?php
// 1.创建dom解析器
$xmldoc=new DOMDocument();
//2.加载xml文件
$xmldoc->load("test.xml");
$domxpath=new DOMXPath($xmldoc);
$nodelist=$domxpath->query("/aaa/ccc");
for ($i=0; $i <$nodelist->length ; $i++) {
echo $nodelist->item($i)->tagName."<br/>";
}
?>

7.simpleXML

核心思想:以面向对象的方式来操作xml

stu.xml

<?xml version="1.0" encoding="UTF-8"?>
<班级>
<学生 stu="001">
<名字>花花</名字>
<年龄>40</年龄>
<介绍>这是我的介绍</介绍>
</学生>
<学生 stu="002">
<名字>菜菜</名字>
<年龄>18</年龄>
<介绍>cmf</介绍>
</学生>
</班级>

test.xml

<?php
// 装载一个xml文件
$lib=simplexml_load_file("stu.xml");
var_dump($lib);
//取出介绍
$insto=$lib->学生;
// echo $insto=$insto[0]->介绍."<br/>"; for ($i=0; $i <count($insto) ; $i++) {
// $in=$insto[$i];
// echo $in->介绍;
// 取出属性的值
echo $insto[$i]['stu'];
// 取出所有的元素
foreach ($insto[$i] as $key => $value) {
echo "$key-----$value<br/>";
} }
// simplexml也可以和xpath结合.取出介绍
foreach ($lib->xpath("//介绍") as $key => $value) {
echo $value."<br/>";
} ?>

【二十八】xml编程(dom\xpath\simplexml)的更多相关文章

  1. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

  2. (转载)Android项目实战(二十八):Zxing二维码实现及优化

    Android项目实战(二十八):Zxing二维码实现及优化   前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中 ...

  3. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  4. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  5. Saiku使用iframe嵌入页面访问地址配置化(二十八)--DWR的基本使用

    Saiku使用iframe嵌入页面使用时ip与端口配置化(二十八)--DWR的基本使用 DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开 ...

  6. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  7. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  8. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  9. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

随机推荐

  1. python selenium chrome有界面与无界面模式

    from selenium.webdriver.chrome.options import Options from selenium import webdriver # 无界面模式 def Chr ...

  2. 使用v-bind处理class与style

    普通的css引入: 变量引入: 通过定义一个变量fontColor来通过v-bind来进行绑定在h3z的class中 <!--变量引入--> <h3 :class="fon ...

  3. bzoj1663: [Usaco2006 Open]赶集

    Description Every year, Farmer John loves to attend the county fair. The fair has N booths (1 <= ...

  4. MySql数据库表操作(二)

    一.增加表记录: insert [into] tab_name (field1,field2....) values (values1,values2....) , (values1,values2. ...

  5. 数据结构(C语言)—排序

    数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...

  6. TCP 的那些事儿(上)(转)

    原文地址:http://kb.cnblogs.com/page/209100/ TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过 ...

  7. django基础 -- 9.中间件

    一.中间件的介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级, 并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用, 用不好 ...

  8. Selenium Java Selection的使用

    用于向具有drop-down的选择框中输入内容 new Select(new ChromeDriver().findElement(By.cssSelector(" ..."))) ...

  9. Yii使用笔记 2

    yii中的 getId等函数, id更多的是一个 string, 而不是数字. CCaptchaAction > CAction > CComponent. 实现是 IAction. yi ...

  10. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...