xml 笔记
程序员文章站
2024-01-03 10:16:34
...
xml是什么
XML:eXtensible Markup Language 可扩展标记语言 version=”1.0”
* 可扩展:所有的标签都是自定义的。
* 功能:数据存储
* 配置文件
* 数据传输
* html与xml区别:
* html语法松散,xml语法严格
* html做页面展示,xml做数据存储
* html所有标签都是预定义的,xml所有标签都是自定义的
W3C:word wide web consortiem 万维网联盟
xml语法:
* 文档声明:
* 必须写在xml文档的第一行。
* 写法:<?xml version="1.0" ?>
* 属性:
* version:版本号 固定值 1.0
* encoding:指定文档的码表。默认值为 iso-8859-1
* standalone:指定文档是否独立 yes 或 no
* 元素:xml文档中的标签
** 文档中必须有且只能有一个根元素
* 元素需要正确闭合。<body></body> <br/>
* 元素需要正确嵌套
* 元素名称要遵守:
* 元素名称区分大小写
* 数字不能开头
* 文本:
* 转义字符:>
* CDATA: 里边的数据会原样显示
* <![CDATA[ 数据内容 ]]>
* 属性:
* 属性值必须用引号引起来。单双引号都行
* 注释:
<!-- -->
* 处理指令:现在基本不用
<?xml-stylesheet type="text/css" href="1.css"?>
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>窝在角落里好安心</name>
<price>¥30</price>
</book>
<book>
<name>一个人的好天气</name>
<price>¥30</price>
<![CDATA[
<h1>好看</h1>
]]>
</book>
</books>
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 出版时间="2017-08-10">
<书名>白夜行</书名>
<作者>东野圭吾</作者>
<单价>¥50</单价>
</书>
<书 出版时间="2017-08-10">
<书名>解忧杂货店</书名>
<作者>东野圭吾</作者>
<单价>¥50</单价>
</书>
</书架>
xml约束:
* 约束就是xml的书写规则
* 约束的分类:
dtd:
dtd分类:
* 内部dtd:在xml内部定义dtd
* 外部dtd:在外部文件中定义dtd
* 本地dtd文件:<!DOCTYPE students SYSTEM "student.dtd">
* 网络dtd文件:<!DOCTYPE students PUBLIC "名称空间" "student.dtd">
schema:
导入xsd约束文档:
1、编写根标签
2、引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3、引入名称空间 xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4、引入默认的名称空间
DTD约束
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student std="s1">
<name>鹿晗</name>
<age>27</age>
<sex>male</sex>
</student>
<student std="s2">
<name>小晗</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
student.dtd
<!ELEMENT students (student*) ><!--students标签下可以有0个或多个student-->
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)><!--可理解成字符串-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student std ID #REQUIRED><!--属性std ID必须唯一且不能为空-->
schema约束
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1、编写根标签
2、引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3、引入名称空间 xsi:schemaLocation="http://www.alltowell.cn/xml student.xsd"
4、引入默认的名称空间
-->
<students
xmlns="http://www.alltowell.cn/xml"
xsi:schemaLocation="http://www.alltowell.cn/xml student.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<student std="20140001">
<name>鹿晗</name>
<age>27</age>
<sex>male</sex>
</student>
<student std="20140001">
<name>小晗</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
student.xsd
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.alltowell.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.alltowell.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<!-- 0个或多个student -->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<!--
xsd:string :万维网联盟
ageType:自定义
-->
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="std" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="2014\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
XML解析:
* 解析xml可以做:
* 如果xml作为配置文件:读取
* 如果xml作为传输文件:写,读
* xml解析思想:
* DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
* 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
* 缺点:dom树非常占内存,解析速度慢。
Document
Element
Text
Attribute
Comment
* SAX:逐行读取,基于事件驱动
* 优点:不占内存,速度快
* 缺点:只能读取,不能回写
* xml常用的解析器:
* JAXP:sun公司提供的解析。支持dom和sax。
* JDOM:
* DOM4J:dom for java民间方式,但是是事实方式。非常好。 支持dom
1.导入jar包 dom4j.jar
2.创建解析器
SAXReader reader = new SAXReader();
3.解析xml 获得document对象
Document document = reader.read(url);
* XPATH:专门用于查询
* 定义了一种规则。
* 使用的方法:
* selectSingleNode():
* selectNodes():
使用步骤:
1、注意:要导包 jaxen...jar
2、创建解析器
SAXReader reader = new SAXReader();
3、解析xml 获得document对象
Document document = reader.read(url);
* 解析XML:
// 1、得到某个具体的节点内容:第2本书的书名--》葵花宝典
// 2、遍历所有元素节点
XPath:
// nodename 选取此节点。
// / 从根节点选取。
// // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
// .. 选取当前节点的父节点。
// @ 选取属性。
// [@属性名] 属性过滤
// [标签名] 子元素过滤
DOM4J解析:导入包dom4j-1.6.1.jar
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 出版时间="2017-08-10">
<书名>白夜行</书名>
<作者>东野圭吾</作者>
<单价>¥50</单价>
</书>
<书 出版时间="2017-08-10">
<书名>解忧杂货店</书名>
<作者>东野圭吾</作者>
<单价>¥50</单价>
</书>
</书架>
TestDom4j.java
package com.dgut.edu.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class TestDom4j {
//得到某个具体的节点内容:第2本书的书名
@Test
public void test1() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
Document document =reader.read("src/books.xml");//把xml文档加载到document对象中
Element root = document.getRootElement();
// Element bookNode = root.element("书");
// System.out.println(bookNode.getName());
List list =root.elements();//得到当前节点的所有子节点
Element secondBook=(Element) list.get(1);//得到第二本书对象
String name=secondBook.element("书名").getText();//得到当前节点的文本内容
System.out.println(name);
}
//遍历所有的节点元素
@Test
public void test2() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
Document document = reader.read("src/books.xml");//把xml文档加载到document对象中
Element root=document.getRootElement();
treeWalk(root);
}
private void treeWalk(Element ele) {
System.out.println(ele.getName());//输出当前节点的名字
for(int i=0;i<ele.nodeCount();i++){//ele.nodeCount()得到当前节点的所以普子节点的数量
Node node=ele.node(i);//取出下标为i的节点
if(node instanceof Element){//判断当前节点是否为标签
treeWalk((Element)node);//把node强转为标签(Element)
}else{
System.out.println(node.getText());
}
}
}
}
XPATH解析:导入包dom4j-1.6.1.jar,导入jaxen-1.1-beta-6.jar,
TestXPath.java
package com.dgut.edu.dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class TestXPath {
//得到某个具体的节点内容:第2本书的书名
@Test
public void test() throws Exception{
SAXReader read = new SAXReader();
Document document=read.read("src/books.xml");
Node node =document.selectSingleNode("/书架/书[2]/书名");
System.out.println(node.getText());
}
//遍历所有的节点元素
@Test
public void test2() throws Exception{
SAXReader read = new SAXReader();
Document document=read.read("src/books.xml");
List list=document.selectNodes("//*");
for(int i=0;i<list.size();i++){
Node node=(Node)list.get(i);
System.out.println(node.getName()+"\t"+node.getText());;
}
}
//输出所有书名
@Test
public void test3() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/books.xml");
List nodes = document.selectNodes("/书架//书/书名");
for (int i = 0; i < nodes.size(); i++) {
Node node = (Node) nodes.get(i);
System.out.println(node.getText());
}
}
}