# XML
可扩展的标记语言
## XML 语法
### 处理指令
XML建议在文件最开始使用一个处理指令
<?xml version="1.0" encoding="UTF-8"?>
要点:
0. 可以没有处理指令,但是建议使用!
1. 必须写在第一行
2. 属性 version="1.0" encoding="UTF-8"
- 目前 version 始终都是1.0 木有变过
- encoding 强烈建议使用 UTF-8!
绝大部分XML的处理指令都写为:
<?xml version="1.0" encoding="UTF-8"?>
### 注释
语法
<!-- Hello World! -->
注释:
1. 注释不能嵌套使用!
### 标记(标签)tag
标记语法:
<标记名> 开始标记
</标记名> 结束标记
<标记名/> 自结束标记
语法:
1. XML 大小写敏感!区分大小写!
2. 开始标签与结束标签要成对使用!
3. 如果是空标记可以使用自结束标签代替
<age></age> 替换为 <age/>
4. 标签是可以嵌套使用的!
### 元素 Element
语法:
开始标签+内容Content+结束标签
关键点:
1. 元素的内容可以是: 子元素,文本或者元素与文本的混合体
2. XML文档只能有一个唯一的根元素!!!
### 属性 Attribute
语法:
name="Value"
关键点:
1. 在开始标签上可以定义
2. 属性: name="Value" value必须有引号
3. 可以定义多个属性,属性之间必须有空格
4. 属性是无序的
### 实体替换(转义)
XML 文件中的特殊字符会解析错误:
<comment>小于号是<大于号是></comment>
> 这里 `<大于号是>` 会被误解为开始标记。
解决的办法是替换为响应的“实体Entity”,其实就是一种转义写法:
<comment>小于号是<大于号是> and 是 & </comment>
常用的 "实体" 有
小于号 <
大于号 >
& &
### CDATA
对于大量的文本,可以利用CDATA包裹起来,这样就可以不用转义了,如:
<code><![CDATA[
XML 元素 <user></user>
]]></code>
## XML 的可扩展特性
XML 是可扩展特性:
1. 标签名可以任意扩展
2. 标签(元素)的嵌套关系可以扩展
3. 标签的属性可以扩展
## XML API
标准的 W3C SAX DOM API非常难以使用,开源社区提供了Dom4j API 非常简便易用,已经成为XML处理的标准。
### 导入 dom4j API
利用Maven导入Dom4j,Maven的使用配置请参考:[http://doc.tedu.cn/maven/index.html](http://doc.tedu.cn/maven/index.html)
步骤:
1. 创建Maven项目
2. 配置 pom.xml 导入 dom4j
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tedu</groupId>
<artifactId>1710_api12</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- maven 组件的坐标 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
### 读取XML
利用Dom4j 的API可以读取xml文件:
String file="books.xml";
FileInputStream in =
new FileInputStream(file);
SAXReader reader = new SAXReader();
//read方法从流中读取byte,并且解析为
//Document 对象(称为文档对象dom)
Document doc = reader.read(in);
//检查文档对象doc的内容
System.out.println(doc.asXML());
> SAXReader 相当于高级流需要从节点流中in读取xml内容。
> SAXReader 也提供了方便使用的重载read方法。
> 按asXML 用于检验doc对象的内容
### 解析XML的内容
XML 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="b1" lang="cn">
<name>十八岁给我一个姑娘</name>
<author>冯唐</author>
</book>
<book id="b2" lang="cn">
<name>相关何处</name>
<author>土家野夫</author>
</book>
<book id="b3" lang="cn">
<name>和空姐同居的日子</name>
<author>三十</author>
</book>
<owner>刘苍松</owner>
</books>
读取解析XML获取全部书籍的ID和name案例:
public class Demo01 {
public static void main(String[] args)
throws Exception{
/**
* 利用Dom4j API 读取XML文件
*/
//books.xml 位置在项目文件夹中
String file="books.xml";
FileInputStream in =
new FileInputStream(file);
SAXReader reader = new SAXReader();
//read方法从流中读取byte,并且解析为
//Document 对象(称为文档对象dom)
Document doc = reader.read(in);
//检查文档对象doc的内容
//System.out.println(doc.asXML());
//System.out.println(doc.getClass());
//找到唯一的根元素 books
Element root=doc.getRootElement();
//System.out.println(root.asXML());
//从root找到全部的 book 子元素
//elements() 返回 root的全部子元素
//root.elements()
//返回root子元素中 指定名称的子元素。
//root.elements(标签名)
List<Element>list=
root.elements("book");//返回全部book
//root.elements();//返回所有book+owner
for (Element e : list) {
//e 代表每个子元素
//System.out.println(e.asXML());
//找到book元素中第一个name子元素
//Element name=e.element("name");
//getText 可以获取元素中的文本内容
//String text=name.getText();
//System.out.println(text);
//读取book元素的属性
String id=e.attributeValue("id");
System.out.println(id);
String n=e.elementText("name");
System.out.println(n);
}
}
}
### 创建XML文档
利用DOM4j 可以创建XML 文档对象:
Document doc=
DocumentHelper.createDocument();
//添加根元素
Element root=
doc.addElement("products");
//addElement 在当前元素上添加子元素
//"product"是子元素名,返回子元素对象
Element p1=root.addElement("product");
//为元素添加属性参数为: 属性名,属性值
p1.addAttribute("id", "p1");
//添加子元素并且添加文本
p1.addElement("name").addText("擎天柱");
Element p2=root.addElement("product");
System.out.println(doc.asXML());
### 写XML文件
//将doc对象写到文件中
FileOutputStream out=
new FileOutputStream(
"products.xml");
//Dom4j 提供了 “漂亮的 Pretty” 格式化功能
OutputFormat fmt=
OutputFormat.createPrettyPrint();
//利用高级流 XMLWriter 将doc对象写到文件中
XMLWriter writer=
new XMLWriter(out,fmt);
writer.write(doc);
writer.close();
## 如何读取XML
1. 先了解被读取的XML结构!!
2. 利用Dom4j 打开文件
3. 按照XML结构利用Dom4j API 按层次读取。
本文介绍了XML的基本语法,包括处理指令、注释、标签、元素、属性、实体替换和CDATA,强调了XML的可扩展性和在JAVA中使用Dom4j API进行XML处理的方法,包括读取、解析和创建XML文档的示例。
711

被折叠的 条评论
为什么被折叠?



