XML:eXtensible Markup Language 可扩展标记语言 version="1.0"
1、可扩展:所有的标签都是自定义的
2、功能
(1)数据存储
1.配置文件(常用)
2.数据传输(少)
3、html与xml区别
(1)html语法松散,xml语法严格
(2)html做页面展示,xml做数据存储
(3)html所有标签都是预定义的,xml所有标签都是自定义的
W3C:word wide web consortiem 万维网联盟
一、XML语法
1、文档声明
(1)必须写在xml文档的第一行
(2)写法:<?xml version="1.0" ?>
(3)属性:
1.version:版本号 固定值 1.0
2.encoding:指定文档的码表。默认值为 iso-8859-1
3.standalone:指定文档是否独立 yes 或 no
2、元素
xml文档中的标签
(1)文档中必须有且只能有一个根元素
(2)元素需要正确闭合。<body></body> <br/>
(3)元素需要正确嵌套
(4)元素名称要遵守
1.元素名称区分大小写
2.数字不能开头
3、文本
(1)转义字符:>
(2)CDATA: 里边的数据会原样显示
* <![CDATA[ 数据内容 ]]>
4、属性
属性值必须用引号引起来。单双引号都行
5、注释
<!-- -->
6、处理指令(现在基本不用 )
<?xml-stylesheet type="text/css" href="1.css"?>
二、XML约束
1、约束
xml的书写规则
2、约束的分类
(1)dtd
dtd分类:
1.内部dtd:在xml内部定义dtd
2.外部dtd:在外部文件中定义dtd
(1)本地dtd文件:<!DOCTYPE students SYSTEM "student.dtd">
(2)网络dtd文件:<!DOCTYPE students PUBLIC "名称空间" "student.dtd">
(2)schema
导入xsd约束文档步骤
1.编写根标签
2.引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入名称空间 xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4. 引入默认的名称空间
三、XML解析
1、解析xml
(1)如果xml作为配置文件:读取
(2)如果xml作为传输文件:写,读
2、xml解析思想
(1)DOM
将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象
优点:因为,在内存中会形成dom树,可以对dom树进行增删改查
缺点:dom树非常占内存,解析速度慢
Document 、 Element 、Text 、Attribute 、Comment
(2)SAX
逐行读取,基于事件驱动
优点:不占内存,速度快
缺点:只能读取,不能回写
3、xml常用的解析器
(1)JAXP(用得少)
sun公司提供的解析。支持dom和sax
(2)JDOM,不火
(3)DOM4J
dom for java民间方式,但是是事实方式,非常好。支持dom
1.导入jar包 dom4j.jar
2.创建解析器
SAXReader reader = new SAXReader();
3.解析xml 获得document对象
Document document = reader.read(url);
查看说明文档中index目录
导入dom4j-1.6.1.jar包,不用build path,XML文件放在src下与包同级
1 public class TestDom4j { 2 @Test // 1、得到某个具体的节点内容,第2本书的书名 3 public void test1() throws DocumentException { 4 SAXReader reader = new SAXReader(); // 创建XML解析对象 5 Document document = reader.read("src/Book.xml"); // 把xml文档加载到document 6 Element rootElement = document.getRootElement(); // 根节点 7 8 Element bookNode = rootElement.element("书"); // 获取“书”节点 9 System.out.println(bookNode.getName()); // 获取书节点的名字 10 11 List list = rootElement.elements(); // 得到当前所有子节点 12 Element secondBook = (Element) list.get(1); // 得到第二本书对象 13 String name = secondBook.element("书名").getText(); // 得到当前节点文本内容,标签的内容 14 System.out.println(name); 15 } 16 17 @Test // 遍历所有元素节点 18 public void test2() throws DocumentException { 19 SAXReader reader = new SAXReader(); 20 Document document = reader.read("src/Book.xml"); 21 Element root = document.getRootElement(); 22 // 遍历节点 23 treeWalk(root); 24 } 25 26 // 遍历节点,输出开始标签 27 private void treeWalk(Element element) { 28 System.out.println(element.getName()); // 输出当前节点的名字 29 for(int i=0; i < element.nodeCount(); i++) { // nodeCount()得到当前节点的所有子节点 30 Node node = element.node(i); // 取出下标为i的节点 31 if(node instanceof Element) { // node是Element类的实例,判断当前节点是否标签 32 treeWalk((Element) node); // 把node强转为节点 33 } 34 } 35 } 36 }
(4)XPATH
专门用于查询
1.定义了一种规则
2.使用的方法
(1)selectSingleNode()
(2)selectNodes()
3、使用步骤
(1)导包
(2)创建解析器
SAXReader reader = new SAXReader();
(3)解析xml 获得document对象
Document document = reader.read(url);
XPath
1、nodename 选取此节点。
2、/ 从根节点选取。
3、// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
4、.. 选取当前节点的父节点。
5、@ 选取属性。
6、[@属性名] 属性过滤
7、 [标签名] 子元素过滤
1 public class TestXPath { 2 @Test 3 public void test1() throws DocumentException { 4 SAXReader read = new SAXReader(); 5 Document document = read.read("src/Book.xml"); 6 Node node = document.selectSingleNode("/书架/书[2]/书名"); // 从1开始 7 System.out.println(node.getText()); 8 } 9 10 @Test 11 public void test2() throws DocumentException { 12 SAXReader read = new SAXReader(); 13 Document document = read.read("src/Book.xml"); 14 List list = document.selectNodes("//*"); // //*当前目录下所有子节点 15 // 遍历所有节点 16 for(int i=0; i < list.size(); i++) { 17 Node node = (Node) list.get(i); 18 System.out.println(node.getName()+"\t"+node.getText()); 19 } 20 } 21 }