XML: 可扩展的标记语言(用户自定义的标记语言)
用途:数据跨平台的存储,传输,共享的;在不同的语言之间也可以通信
XML基本语法格式:
文件扩展名必须以.xml结束(.html)
xml中第一个标签叫文档标签
<?xml version=”1.0” encoding=”utf-8”?>
Version:xml版本是1.0
Encoding:xml文档编码
xml中所有的标签都是用户自定义的,且区分大小写
<div></DIV> != <DIV></DIV> <div></div> <hr/><br/>
xml中所有的标签都是成对出现了,有开始,必须有结束,除非中间没有内容,可以使用单标签来代替 <br/> <hr/>
<student></student> = <student/>
xml文件中有且只有一个最大的根节点。
xml中嵌套必须合理,且每一个节点有且只有 一个直接的父级节点。
<div><p></p></div> <student><age></age></studetn>
xml中的空格保留,不能随便乱打空格。
<p></p > #这里p后面多个空格系统就无法识别了#
xml中的属性必须使用单引号和双引号括起来。
<font size="2"></font>
XML用途:
RSS订阅/xml订阅 - 基本不用了
百度地图(百度标签定义) .xml
第三方平台api接口的提交和返回值, xml格式的数据和json格式
Thinksite
Student
Sid sname addr age
1001 tom UK 30
1002 lily USA 25
【Student.xml】
<?xml version="1.0" encoding="utf-8"?>
<thinksite>
<student>
<stu>
<sid>1001</sid>
<sname>tom</sname>
<addr>UK</addr>
<age>30</age>
</stu>
<stu>
<sid>1002</sid>
<sname>lily</sname>
<addr>USA</addr>
<age>25</age>
</stu>
</student>
</thinksite>
XML生成:
字符串的链接:
【sutdent.php】
<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "123456";
try{
$pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
echo $e -> getMessage();
}
$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data = $result-> fetchAll();
$xml = "<?xml version='1.0' encoding='utf-8'?>";
$xml .= "<thinkshop>";
$xml .= "<marks>";
foreach($data as $key=>$vo){
$xml .= "<records>";
foreach($vo as $k=> $v)
$xml .= "<{$k}>".$v."</$k>";
$xml .= "</records>";
}
$xml .= "</marks>";
$xml .= "</thinkshop>";
$fp = fopen("markxml.xml","w");
fwrite($fp,$xml);
fclose($fp);
DOM生成:
$dom = new DOMDocument(版本号, 编码)
$dom -> createElement("创建元素节点");
$dom -> createTextNode("创建文本节点");
$dom节点对象 -> setAttribute("属性名","值");
节点 -> appendChild(子节点) 将子节点,追加到节点上
Save(文件名): 将domxml对象保存成某个文件
Savexml():使用dom生成xml内容的字符串
【marks.php】
<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";
try{
$pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
echo $e -> getMessage();
}
$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data = $result-> fetchAll();
$dom = new DomDocument("1.0","utf-8");
$root = $dom -> createElement("thinkshop");
$dom -> appendChild($root);
$marks = $dom -> createElement("marks");
$root -> appendChild($marks);
foreach($data as $vo){
$records = $dom -> createElement("records");
$marks->appendChild($records);
foreach($vo as $k=>$v){
$nodes = $dom -> createElement($k);
$nodes -> setAttribute("name","s");
$records -> appendChild($nodes);
$nodes_text = $dom -> createTextNode($v);
$nodes -> appendChild($nodes_text);
}
}
$dom -> save("domxml.xml");
?>
<a href="./domxml.xml">xml订阅</a>
XML的发布:
就是在外部网站中使用a链接,将需要发布的xml文件,做a链接指向就行。
XML的解析: 将xml文件解析成网页或者得到需要的数据格式。
simplexml解析: php内置的一个xml解析扩展类库(默认开启了)
children(): 返回某个simplexml节点对象的所有子节点对象。
simplexml_load_stirng(xml内容字符串): 将xml字符串转换成simplexml节点对象
【marks1.php】
<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";
try{
$pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
echo $e -> getMessage();
}
$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data = $result-> fetchAll();
$xml = "<?xml version='1.0' encoding='utf-8'?>";
$xml .= "<thinkshop>";
$xml .= "<marks>";
foreach($data as $key=>$vo){
$xml .= "<records>";
foreach($vo as $k=> $v)
$xml .= "<{$k}>".$v."</$k>";
$xml .= "</records>";
}
$xml .= "</marks>";
$xml .= "</thinkshop>";
// 就是将xml内容取出具体的数据信息,这种操作就是xml解析.
$simple = simplexml_load_string($xml);
foreach($simple ->children() as $vo){
foreach($vo ->children() as $v){
echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark;
echo "<hr/>";
}
}
Simplexml_load_file(文件路径+文件名): 将xml文件读取转换成simplexml节点对象
【marks2.php】
<?php
$file = "domxml.xml";
// 就是将xml内容取出具体的数据信息,这种操作就是xml解析.
$simple = simplexml_load_file($file);
foreach($simple ->children() as $vo){
foreach($vo ->children() as $v){
echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark;
echo "<hr/>";
}
}
?>
Simplexml_import_dom(): 将DOM对象DOM节点对象转换成simplexml节点对象。
【marks3.php】
<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";
try{
$pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
echo $e -> getMessage();
}
$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data = $result-> fetchAll();
$dom = new DomDocument("1.0","utf-8");
$root = $dom -> createElement("thinkshop");
$dom -> appendChild($root);
$marks = $dom -> createElement("marks");
$root -> appendChild($marks);
foreach($data as $key=>$vo){
$records = $dom -> createElement("records");
$marks->appendChild($records);
foreach($vo as $k=>$v){
$nodes = $dom -> createElement($k);
$nodes -> setAttribute("name","s");
$records -> appendChild($nodes);
$nodes_text = $dom -> createTextNode($v);
$nodes -> appendChild($nodes_text);
}
}
// 就是将xml内容取出具体的数据信息,这种操作就是xml解析.
$simple = simplexml_import_dom($dom);
foreach($simple ->children() as $vo){
foreach($vo ->children() as $v){
echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark;
echo "<hr/>";
}
}
?>
DOM解析: PHP内置的一个使用DOM解析xml的扩展类库
创建DOM对象:
$dom = new DomDocument();
$dom -> load(“文件/字符串”): 将xml文件或者是字符串加载成dom对象
$root = $dom -> documentElement
遍历内部所有节点
childNodes:返回的是某个节点下的所有的子节点
getAttribute();
NodeType
Nodevalue
xml层级比较多,遍历时很麻烦,这个时候再simplexml中提供了xpath定位,在dom中有getElementByTagName() 方法。
【dom.php】
<?php
$file = "domxml.xml";
$dom = new DomDocument();
$dom -> load($file);
$root = $dom -> documentElement;
foreach($root->childNodes as $vo){
foreach($vo->childNodes as $v){
foreach($v->childNodes as $v1){
if($v1 -> nodeType ==1){
echo $v1 -> nodeValue;
}
echo "<hr/>";
}
}
}
// 层级太多,使用xpath
$objs = $dom -> getElementsByTagName("records");
foreach($objs as $vo){
foreach($vo -> childNodes as $v){
if($v -> nodeType ==1){
echo $v -> nodeValue;
}
}
}
?>
css解析:就是使用css,将xml内容解析成需要的网页样式(XSL)。
<?xml-stylesheet type="text/css" href="cssfile"?> 使用标签选择器比较多。
xmlreader(xmlwriter):PHP内置的一个xml解析扩展类库
Simplexml和dom都是将xml内容一次性读入内存中进行解析。缺点就是如果文件很大,那么浪费资源很严重,且速度很慢。
Xmlreader可以边加载,边读取xml内容,对于大文件xml解析是一种较好的解决方法.
创建xmlreader对象。
$reader = new XmlReader();
打开xml文件
$reader -> open(“xml文件”);
读取xml内容
$reader -> read();从xml文件一个个的挨着读取内容,每读取一条内容就跳转到下一条,直到没有内容,就会报出false错误。(php文件按行读取)
nodeType:返回的是节点类型
xmlReader::ELEMENT 元素节点
xmlReader::TEXT 文本节点
Name: 返回某个节点的标签名
Value: 返回某个节点的文本内容
expand():读取一个节点转变为dom节点对象