XML
目录结构:
contents structure [-]
1 什么是XML
XML(eXtensible markup language) 是一种可扩展的标记语言 ,即使可以自定义标签的语言。
2 解析XML
2.1 解析的两种方式
XML的解析分为两种方式,分别是SAX和DOM。
DOM:(Document Object Model,就是文档对象模型),是W3C组织推荐的处理XML的一种方式。使用该方式解析XML文档,会把文档中的所有元素,按照其出现的层次关系,在内存中构造出树形结构。因此对内存的压力大,解析熟读慢,优点就是可以遍历和修改节点的内容。
SAX:(Simple API for XML) 是一种XML解析的替代方法。相比较于DOM,解析速度更快,内存的压力更小;缺点就是不能修改节点的内容。
2.2 使用dom4j解析XML
在使用dom4j解析XML之前需要导入相关的工具包,比如笔者的: dom4j-1.6.1.jar 包
2.2.1 dom4j的API
//创建SAXReader,是dom4j包提供的解析器 SAXReader reader=new SAXReader(); //读取指定的文件 Document doc=reader.read(new File(filename)); Document Document getRootElement() 用于获取根元素 Element Element element(String name) 获取元素下指定名称的子元素 List<Element> elements() 获取元素下所有的子元素 String getName() 获取元素名 String getText() 获取元素文本内容 String elementText(String name) 获取子元素文本内容 Attribute attribute(String) 获取元素的属性 String attributeValue(String name) 获取元素的属性值 Attribute String getName() 获取属性的名字 String getValue() 获取属性的值
2.2.2 打印一个XML文件的全部内容
pricties.xml文件直接位于项目下
<?xml version="1.0" encoding="utf-8" ?>
<books id="a">
<book id="b">
<name id="c_1" name="c_2">三国演绎</name>
<author id="d_1" name="d_2" >罗贯中</author>
<price id="e">58.8</price>
</book>
<book id="f_1" name="f_2">
<name id="g">水浒传</name>
<author id="h">施耐庵</author>
<price id="i">49.8</price>
</book>
<book id="j_1" name="j_2">
<name id="k">西游记</name>
<author id="l">吴承恩</author>
<price id="m">100.1</price>
<order>1</order>
</book>
</books>
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ParseXML {
public static void main(String[] args) {
//创建SAXReader对象
SAXReader saxr=new SAXReader();
Document docu=null;
try{
//读取指定的文件,相对于项目路径
docu=saxr.read(new File("pricties.xml"));
//获得元素的文件的根节点
Element e=docu.getRootElement();
searchAllElement(e);
}catch(Exception e){
e.printStackTrace();
}
}
public static void searchAllElement(Element e){
//获得当前元素下的所有子元素,并存储到集合中
List<Element> elements=e.elements();
System.out.print("<"+e.getName());//打印开始标记
List<Attribute> atrs=e.attributes();//打印该标记下的所有属性
for(Attribute att:atrs){
System.out.print(" "+att.getName()+"=\""+att.getValue()+"\"");
}
System.out.println(">");
//如果集合的大小为0,表示该集合下没有子元素了
if(elements.size()==0){
System.out.println(e.getText());//打印文本信息
System.out.println("</"+e.getName()+">");//打印结束标记
return;//退出当前层方法
}
//递归每一个子元素
for(Element ele:elements){
searchAllElement(ele);
}
System.out.println("</"+e.getName()+">");//打印结束标记
}
}
2.3 在dom4j中应用XPath解析XML
首先需要在dom4j基础上引入相应的jar包,比如读者的: jaxen-1.1-beta-6.jar
2.3.1 XPath的API
Document List<Node> selectNodes(String xpath) Node selectSingleNode(String xpath)
2.3.2 XPath的路径表达式
2.3.2.1 XPath的路径表达式规则

2.3.2.2 XPath的路径表达式应用案例

2.3.3 通配符
2.3.3.1 通配符规则

2.3.3.2 通配符应用案例

2.3.4 谓语
2.3.4.1 谓语规则
谓语是用来查找某个特定的节点或是包含某个指定的值的节点
谓语被嵌在方括号中
2.3.4.2 谓语应用案例

3 java写XML文件
3.1 将一个带有书籍信息的List集合解析为XML文件
package com.xdl.xml;
public class Book {
private String name;
private String author;
private String price;
public Book() {
super();
}
public Book(String name, String author, String price) {
super();
setName(name);
setAuthor(author);
setPrice(price);
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the author
*/
public String getAuthor() {
return author;
}
/**
* @param author the author to set
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* @return the price
*/
public String getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(String price) {
this.price = price;
}
}
package com.xdl.xml;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
public class WriteXML {
public static void main(String[] args) {
//创建一个Book集合用于存储书籍信息
List<Book> list_books=new ArrayList<Book>();
//插入书籍信息
for(int i=0;i<6;i++){
Book book=new Book("jame"+i,"author"+i,""+i);
list_books.add(book);
}
//创建一个文档对象
Document doc=DocumentHelper.createDocument();
//创建一个根节点
Element books=DocumentHelper.createElement("books");
//获得书籍集合的大小
int size=list_books.size();
for(int i=0;i<size;i++){
//创建一个book节点
Element book=books.addElement("book");
//创建一个name节点
Element name=book.addElement("name");
//创建一个author节点
Element author=book.addElement("author");
//创建一个price节点
Element price=book.addElement("price");
name.setText(list_books.get(i).getName());
author.setText(list_books.get(i).getAuthor());
price.setText(list_books.get(i).getPrice());
}
//设置文档根节点
doc.setRootElement(books);
try {
//如果文件不存在,会自动创建
FileOutputStream fos =
new FileOutputStream(new File("books.xml"));
XMLWriter xmlw = new XMLWriter(fos);
xmlw.write(doc);
xmlw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


浙公网安备 33010602011771号