首页 > 代码库 > 13、XML

13、XML

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)转义字符:&gt;
(2)CDATA: 里边的数据会原样显示
                    *  <![CDATA[ 数据内容 ]]>
 

4、属性

属性值必须用引号引起来。单双引号都行
 

5、注释

<!-- -->
 

6、处理指令(现在基本不用 )

<?xml-stylesheet type="text/css" href="http://www.mamicode.com/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 }

 


 

 

13、XML