1、简介
XML,eXtendsible Markup Language。可扩展标记语言
由W3C组织发布,目前推荐遵守的是W3C组织于2000年发布的XML1.0规范
XML主要用来传输和存储数据
特点:
没有预定义标签,都是自定义标签
2、语法规则
⑴ XML声明要么不写,要写就要写在第一行,并且前面不能有任何字符
⑵ 严格区分大小写
⑶ 标签不能以数字开头
⑷ 属性必须有值,且必须用引号引起来
⑸ 只能有一个根标签
⑹ 标签必须正确地结束
⑺ 标签不能交叉嵌套
⑻ 注释不能嵌套
3、HelloWorld
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<![CDATA[<b>最好的侦探小说!</b>]]>
<name>福尔摩斯探案集</name>
<author>柯南·道尔</author>
<price>100</price>
</book>
<!-- 这里是注释 -->
<book id="2">
<name>解忧杂货店</name>
<author>东野圭吾</author>
<price>27.2</price>
</book>
<book id="3">
<name>小王子</name>
<author>安托万</author>
<price>19.2</price>
</book>
</books>
4、文档组成
XML声明
version:指定XML版本,属性值只有1.0
encoding:指定的字符集。告诉解析器使用什么字符集进行解码
CDATA区
当一些内容不希望XML解析器解析时,可以写在CDATA区中
格式:
<![CDATA[内容]]>
5、XML解析
概念
XML解析是指通过解析器读取XML文档,解释语法,并将文档转化为对象
Java平台同时提供了DOM和SAX两种解析技术
DOM
DOM(Document Object Model)
⑴ 需要一次性将整个XML文档加载到内存中,速度较慢
⑵ 将XML转换为DOM树后,因为DOM树常驻内存,可以重复访问
⑶ 内存占用较大
⑷ 可以读取,也可以修改
⑸ 完全面向对象的解析方式,使用方便
SAX
SAX(Simple API for XML)
⑴ 顺序解析XML,不会将整个XML文档都加载到内存中。速度快
⑵ 已经解析过的XML文档,如果没有保存,将不能获得。除非重新解析
⑶ 内存占用低
⑷ 只能读取,不能修改
⑸ 通过事件的回调函数解析XML,略复杂
6、dom4j
概念
dom4j,是一个非常优秀的Java XML API,功能强大,使用方便
使用dom4j开发,需要导入dom4j-1.6.1.jar包
⑴ 解析XML
① 创建解析器对象
② 解析XML,获取Document对象
③ 获取根元素
④ 根据子元素的属性,位置来获取对应的元素
相关方法
public SAXReader() {}
创建解析器对象
public Document read(String systemId) throws DocumentException {}
获取Document对象。需要将XML的路径传入
Element getRootElement();
获取根元素
List elements(String name);
根据标签名,获取多个子元素
String attributeValue(String name);
根据属性名,获取属性值
Element element(String name);
根据标签名,获取单个子元素
String getText();
获取元素的内容
String elementText(String name);
根据标签名,获取元素的内容
使用示例
【Book】
首先需要封装一个JaveBean。属性值String类型,对应XML中的Book的子元素名。提供有参构造,并重写toString方法
【测试类】
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.test.bean.Book;
public class Dom4JTest {
public static void main(String[] args) throws DocumentException {
// 创建解析器对象
SAXReader reader = new SAXReader();
// 获取Document对象
Document document = reader.read("books.xml");
// 获取根元素
Element rootEle = document.getRootElement();
// 根据标签名,获取多个子元素
List<Element> childEles = rootEle.elements("book");
int size = childEles.size();
for (int i = 0; i < size; i++) {
Element childEle = childEles.get(i);
// 获取属性值
String id = childEle.attributeValue("id");
// System.out.println(id);
// 根据标签名,获取单个子元素
Element nameEle = childEle.element("name");
// 获取元素的内容
String name = nameEle.getText();
// System.out.println(name);
// 根据标签名,获取元素的内容
String author = childEle.elementText("author");
// System.out.println(author);
String price = childEle.elementText("price");
// System.out.println(price);
// 将每个属性值封装到JavaBean的实例中
Book book = new Book(id, name, author, price);
// 打印该对象
System.out.println(book);
}
}
}
⑵ 新建XML
① 新建一个XML格式
② 创建XMLWriter对象
③ 创建Document对象
④ 添加一个一个的元素
⑤ 将元素写到文件中
⑥ 关闭XMLWriter流
相关方法
public static OutputFormat createPrettyPrint() {}
新建一个良好的XML格式。静态方法,通过OutputFormat来调用
Tips:通过该方法创建的XML格式,会将每个元素分行,并且上下级元素会有2个空格的缩进
public XMLWriter(OutputStream out, OutputFormat format)
throws UnsupportedEncodingException {}
创建一个XMLWriter对象,用于输出XML。第一个参数OutputStream为一个输出流,第二个参数OutputFormat即创建的XML格式
public static Document createDocument() {}
创建Document对象。静态方法,通过DocumentHelper来调用
Element addElement(String name);
添加子元素。通过Document或Element对象来调用
Element addAttribute(String name, String value);
给元素添加属性
Element addText(String text);
给元素添加内容
public void write(Document doc) throws IOException {}
将Document对象写入到文件中。通过XMLWriter对象,只需传入Document对象,即可将Document对象里的所有子元素都输出到文件中
public void close() throws IOException {}
关闭输出流。通过XMLWriter对象来调用
使用示例
【测试类】
// 创建良好的XML风格
OutputFormat format = OutputFormat.createPrettyPrint();
// 创建XMLWriter对象
XMLWriter writer = new XMLWriter(new FileOutputStream("test.xml"), format);
// 创建Document对象
Document document = DocumentHelper.createDocument();
// 创建根元素
Element rootEle = document.addElement("persons");
// 创建一个子元素
Element p1 = rootEle.addElement("person");
// 添加属性
p1.addAttribute("id", "1");
// 添加子元素的子节点
Element name1Ele = p1.addElement("name");
// 添加元素内容
name1Ele.addText("张三");
Element age1Ele = p1.addElement("age");
age1Ele.addText("14");
// 创建另一个子元素
Element p2 = rootEle.addElement("person");
p2.addAttribute("id", "2");
Element name2Ele = p2.addElement("name");
name2Ele.addText("李四");
Element age2Ele = p2.addElement("age");
age2Ele.addText("16");
// 将所有的元素写入到文件中
writer.write(document);
// 关闭流
writer.close();
【输出结果】
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>张三</name>
<age>14</age>
</person>
<person id="2">
<name>李四</name>
<age>16</age>
</person>
</persons>
7、XPath
概念
XPath是在XML文档中查找信息的语言。其通过元素和属性进行查找,是W3C组织发布的标准
使用XPath,需要导入jaxen-1.1-beta-6.jar包
语法
⑴ 绝对定位
/标签名
示例:/books/book
选择books的所有book子元素
⑵ 相对定位
//标签名
示例://book
选择所有的book元素
⑶ 查找有属性的元素
//标签名[@属性名]
示例://book[@id]
选择所有的有id属性的book元素
⑷ 查找特定的属性值的元素
//标签名[@属性名='属性值']
示例://book[@id=’1’]
选择id等于1的book元素
在dom4j中使用XPath
⑴ 导入jar包
⑵ 调用相关的方法
相关方法
List selectNodes(String xpathExpression);
选择符合条件的所有的元素。返回一个保存了所有的Node对象的List集合
Node selectSingleNode(String xpathExpression);
选择符合条件的单个元素。返回一个Node对象
Tips:Node是Element的祖先
所以可以将得到的Node对象,向下转型为Element对象,以便调用Element的方法
使用示例
【测试类】
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;
public class XPathTest {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read("books.xml");
List<Node> selectNodes = document.selectNodes("/books/book");
System.out.println("/books/book 选择的:" + selectNodes.size() + "个");
selectNodes = document.selectNodes("//book");
System.out.println("//book 选择的:" + selectNodes.size() + "个");
selectNodes = document.selectNodes("//book[@id]");
System.out.println("//book[@id] 选择的:" + selectNodes.size() + "个");
Element idEle = (Element) document.selectSingleNode("//book[@id='1']");
String name = idEle.elementText("name");
System.out.println(name);
}
}
【输出结果】
/books/book 选择的:3个
//book 选择的:3个
//book[@id] 选择的:3个
福尔摩斯探案集