XML基础
XML构成模块
- 元素
- 属性
- 实体
转义字符 - PCDATA
这种类型是可以被解析器解析的类型
也就是说应当使用实体代替转义字符 - CDATA
不会被解析器解析
XML语法
1. 必须有关闭标签
2. 正确的嵌套标签
3. 整个文档必须有一个根元素,也就是说所有文档都在一个元素下面
4. 属性值必须加引号
5. 会保留元素值原有格式
6. 大小写敏感
转义字符
<
<
>
>
&
&
'
’
"
”
在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
子元素和属性之争
应当尽量避免使用属性:
1.属性不能表示树结构
2.属性无法做扩展
使用CSS
CSS能够渲染XML元素
1. 引入CSS:
<!xml-stylesheet type="text/css" href="path">
- CSS内容是针对特定的元素,进行特定的格式渲染
例子:
1.xml文件
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="attributeTest.css"?>
<!DOCTYPE computer[
<!ELEMENT computer (cpu,gpu,mainboard,ram,keyboard,display*,mouse?)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT gpu (#PCDATA)>
]>
<computer>
<cpu>
Intel i7
</cpu>
<gpu>
GTX 750TI
</gpu>
</computer>
2.css文件
computer{
display: block;
background-color: #fff0ff;
width:50%;
}
gpu{
display: block;
background-color: #f0ffff;
}
DTD
引用DTD
<!DOCTYPE root_element SYSTEM "xxx.dtc">
例子:
1. xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root SYSTEM "student.dtd">
<root>
<name>zhangsan</name>
<age>20</age>
</root>
- student.dtd
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
内部DTD
包含在xml文档内部,语法如下:
<!DOCTYPE root_element[
定义
]>
外部DTD
引用文件外的DTD作为约束,语法如下:
1.xml引用语法
<!DOCTYPE root_element SYSTEM "dtd_path">
- dtd
定义语法
ELEMENT
用于定义元素,格式如下:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
1.定义空元素
<!ELEMENT element_name EMPTY>
2.PCDATA元素
<!ELEMENT elemtn_name (#PCDATA)>
3.任何内容元素
<!ELEMENT element_name ANY>
4.子元素
1.逗号分隔规定出现顺序
spring.dtd中:
<!ELEMENT beans (
description?,
(import | alias | bean)*
)>
解释:
首先出现一个或者0个description元素
后面出现import或者alias或者bean 0个、多个
例子
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE computer[
<!ELEMENT computer (cpu,gpu,mainboard,ram,keyboard,display*,mouse?)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT gpu (#PCDATA)>
<!ELEMENT mainboard (#PCDATA)>
<!ELEMENT ram (size,brand)>
<!ELEMENT keyboard (#PCDATA)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT display (#PCDATA)>
<!ELEMENT mouse (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT brand (#PCDATA)>
]>
<computer>
<cpu>
Intel i7
</cpu>
<gpu>
GTX 750TI
</gpu>
<mainboard>
技嘉 840m
</mainboard>
<ram>
<size>8G</size>
<brand>金士顿</brand>
</ram>
<keyboard>
ikbc
</keyboard>
<display>
AOC
</display>
<mouse>
雷蛇
</mouse>
</computer>
ATTLIST
定义元素的属性,语法如下:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
- 属性类型
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1竖线en2竖线..) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
2.属性默认值
值 | 解释 |
---|---|
值 | 属性的默认值 |
REQUIRED | 属性值是必需的 |
IMPLIED | 属性不是必需的 |
FIXED value | 属性值是固定的 |
实体
用来定义实体,以供外界引用,如:
< 表示>
语法如下:
<!ENTITY 实体名称 "实体的值">
例子:
<!ENTITY god "zhousi">
引用:
&god;
外部实体
在xml中引用外部实体:
<!ENTITY 实体名字 SYSTEM "DTD路径">
XMLHttpRequest
创建对象
1.现在
xmlhttp=new XMLHttpRequest();
2.老版本
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
所以为了兼容,两种方式都要进行:
var xmlhttp;
function ajax(){
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else if(window.ActiveXObject){
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if(xmlhttp==null){
alert("your browser does not support XMLHTTP");
}else{
//设置状态变化对应的处理函数
xmlhttp.onreadstatechange=state_change();
//打开和url的连接,参数分别是 方法 url 是否异步
xmlhttp.open("GET",url,true);
//发送要发送的数据
xmlhttp.send(null);
}
}
function state_change(){
if(xmlhttp.readyState==4){
//200表示成功
if(xmlhttp.status==200){
}else{
}
}
}
属性
readyState
状态 | 名称 | 描述 |
---|---|---|
0 | Uninitialized | 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。 |
1 | Open | open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。 |
2 | Sent | Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。 |
3 | Receiving | 所有响应头部都已经接收到。响应体开始接收但未完成。 |
4 | Loaded | HTTP 响应已经完全接收。 |
每次属性值==增加==时会触发onreadystatechange方法的触发
responseXML
responseText
status
statusText
例子:
<html>
<head>
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url){
xmlhttp=null;
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else if (window.ActiveXObject){
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp!=null){
xmlhttp.onreadystatechange=state_Change;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}else{
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change(){
document.write("readyState:"+xmlhttp.readyState+"<br/>");
document.write("status:"+xmlhttp.status+"<br/>");
document.write("statusText:"+xmlhttp.statusText+"<br/>");
document.write("responseText:"+xmlhttp.responseText+"<br/>");
document.write("responseXML:"+xmlhttp.responseXML+"<br/>");
document.write("<br/>");
}
</script>
</head>
<body onload="loadXMLDoc('/example/xdom/test_xmlhttp.txt')">
</body>
</html>
结果:
readyState:1
status:0
statusText:
responseText:
responseXML:null
readyState:2
status:200
statusText:OK
responseText:
responseXML:null
readyState:3
status:200
statusText:OK
responseText:This is a test using an XML HTTP request to show a text file. If this text shows, it worked!
responseXML:null
readyState:4
status:200
statusText:OK
responseText:This is a test using an XML HTTP request to show a text file. If this text shows, it worked!
responseXML:null
方法
- abort:取消当前响应,关闭连接
- getAllResponseHeaders:获取HTTP相应头部
- getResponseHeader(String):获取相应的头部
open(method, url, async, username, password)
将readyState设置为1
初始化各个属性
一般不会真正打开连接send(body)
readyState值为1
发送HTTP请求,结合open方法的参数构成一个HTTP头
将readyState值设为2
如果不使用异步,将阻塞到readyState为4- setRequestHeaader(name,value)
试验xml是在同目录下的dtd/attributeTest.xml中,具体内容如下:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="attributeTest.css"?>
<computer>
<cpu>
Intel i7
</cpu>
<mainboard>
技嘉 840m
</mainboard>
<gpu>
GTX 750TI
</gpu>
<ram>
<size>8G</size>
<brand>金士顿</brand>
</ram>
<display>
AOC
</display>
<mouse>
雷蛇
</mouse>
</computer>
节点类型
- 整个文档是一个文档节点(document)
- 每个 XML 标签是一个元素节点
- 包含在 XML 元素中的文本是文本节点,所有的文本都在文本节点中
- 每一个 XML 属性是一个属性节点
注释属于注释节点
节点信息
nodeName
nodeName 是只读的
元素节点的 nodeName 与标签名相同
属性节点的 nodeName 是属性的名称
文本节点的 nodeName 永远是 #text
文档节点的 nodeName 永远是 #documentnodeValue
元素节点的 nodeValue 是 undefined
文本节点的 nodeValue 是文本自身
属性节点的 nodeValue 是属性的值- nodeType
元素类型 | 节点类型 |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
注释 | 8 |
文档 | 9 |
例子:打印各个节点的nodeName,nodeValue,nodeType;
<!DOCTYPE html>
<html>
<head>
<title>解析XML Node</title>
<meta charset="utf-8">
<script type="text/javascript" src="loadxml.js"></script>
<script type="text/javascript">
function parseXMLNode(){
var xmldoc=loadXML("dtd/attributeTest.xml");
oneNode(xmldoc,0);
}
function oneNode(node,level){
var childNodes=node.childNodes;
for(var i = 0;i<level;i++){
document.write(" ");
}
//打印nodeType
document.write("Type:"+node.nodeType+" ");
document.write("Name:"+node.nodeName+" ");
document.write("Value:"+node.nodeValue);
document.write("<br/>");
for(var i = 0;i<childNodes.length;i++){
oneNode(childNodes[i],level+2);
}
}
</script>
</head>
<body>
<script type="text/javascript">
parseXMLNode();
</script>
</body>
</html>
结果:
Type:9 Name:#document Value:null
Type:7 Name:xml-stylesheet Value:type="text/css" href="attributeTest.css"
Type:1 Name:computer Value:null
Type:3 Name:#text Value:
Type:1 Name:cpu Value:null
Type:3 Name:#text Value: Intel i7
Type:3 Name:#text Value:
Type:1 Name:mainboard Value:null
Type:3 Name:#text Value: 技嘉 840m
Type:3 Name:#text Value:
Type:1 Name:gpu Value:null
Type:3 Name:#text Value: GTX 750TI
Type:3 Name:#text Value:
Type:1 Name:ram Value:null
Type:3 Name:#text Value:
Type:1 Name:size Value:null
Type:3 Name:#text Value:8G
Type:3 Name:#text Value:
Type:1 Name:brand Value:null
Type:3 Name:#text Value:金士顿
Type:3 Name:#text Value:
Type:3 Name:#text Value:
Type:1 Name:display Value:null
Type:3 Name:#text Value: AOC
Type:3 Name:#text Value:
Type:1 Name:mouse Value:null
Type:3 Name:#text Value: 雷蛇
Type:3 Name:#text Value:
DOM解析
解析XML文件
- 通过微软的XML解析器加载XML
//创建XML文档对象
xmlDoc=new ActiveXObject("Microsoft,XMLDOM");
//关闭异步加载
xmlDoc.async="false";
//通过load方法加载xml文档
xmlDoc.load("");
- 其他浏览器解析
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("books.xml");
解析XML字符串
- 微软解析
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);
- 其他浏览器解析
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
属性和方法
常见的属性
x.nodeName - x 的名称
x.nodeValue - x 的值
x.parentNode - x 的父节点
x.childNodes - x 的子节点
x.attributes - x 的属性节点
常见的方法
x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
x.appendChild(node) - 向 x 插入子节点
x.removeChild(node) - 从 x 删除子节点
例子:
function showXML(url){
//加载xml
var xmldoc=loadXML(url);
//xml域测试
alert(xmldoc.nodeName);
alert(xmldoc.nodeValue);
alert(xmldoc.parentNode);
alert(xmldoc.childNodes[0].nodeValue);
alert(xmldoc.attributes);
//方法测试
var cpu=xmldoc.getElementsByTagName("cpu")[0];
alert("cpu:"+cpu.childNodes[0].nodeValue);
}