dom4j的简单使用
首先,向你的项目引入dom4j.js文件,这是必不可少的。
如果你还没有该js文件,可以直接到此处下载
解析XML
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Foo {
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
获取xml文件信息(重点看,我写的)
第一步,当然是把dom4j的jar包放好。
然后,我们写一个book.xml文件如下图,附上代码:
<?xml version="1.0" encoding="utf-8" ?>
<books>
<book id="1">
<name>三国演义</name>
<price>100</price>
</book>
<book id="2">
<name>水浒传</name>
<price>99</price>
</book>
</books>
然后,我们写一个Book.java类(本例子其实也可以不写该类)
package com.hstc.lcw;
public class Book {
private Integer id;
private String name;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Book() {
}
public Book(Integer id, String name, Double price) {
this.id = id;
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
再写一个Main.java类
package com.hstc.lcw;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Main {
public static void main(String[] args){
//读取xml文件
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("01-xml/xml/books.xml");
//获取root元素
Element root = document.getRootElement();
//获取root元素下的所有book元素,如果只要一个,那么用方法element
List<Element> books = root.elements("book");
System.out.println("输出每一个book标签");
//遍历搜索到的root下所有的book标签
for (Element item : books){
//把标签转化为string格式输出查看
System.out.println(item.asXML());
//输出每个book标签的name标签
Element nameElement = item.element("name");
System.out.println("name标签为:"+nameElement.asXML());
//输出每个name标签里面的内容
String nameText = nameElement.getText();
System.out.println("name标签的内容为:"+nameText);
//也可以使用Element对象的elementText方法直接获取
String priceText = item.elementText("price");
System.out.println("price标签的内容为:"+priceText);
//使用Element对象的attributeValue方法获取book标签的属性值
String idText = item.attributeValue("id");
System.out.println("id值为:"+ idText);
//将数据存入Book对象
System.out.println("以字符串形式输出:");
Book book = new Book(Integer.parseInt(idText),nameText,Double.parseDouble(priceText));
//以string形式输出
System.out.println(book);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
运行结果如下(着重看其中遍历的一个结果即可,已用红色方框框起来):
以下是官方给出的使用方法
迭代器
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();
// 遍历root的子元素,不包含孙子元素信息
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element element = it.next();
// do something
}
// 通过foo遍历root的子元素
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
// do something
}
// 遍历root的所有参数
for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next();
// do something
}
}
XPath
XPath 表达式可以在树中的 Document 或 节点的任何地方(例如Attribute、 Element或 ProcessingInstruction)进行计算。这允许使用一行代码在整个文档中进行复杂的导航。
public void bar(Document document) {
List<Node> list = document.selectNodes("//foo/bar");
Node node = document.selectSingleNode("//foo/bar/author");
String name = node.valueOf("@name");
}
如果你想在XHTML文档中找到所有超文本链接,那么大可以使用下面代码:
public void findLinks(Document document) throws DocumentException {
List<Node> list = document.selectNodes("//a/@href");
for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}
快速循环
如果你不得不遍历大型XML文档树,那么为了提高性能,建议使用快速循环方法,这样可以避免Iterator为每个循环创建对象的成本。例如
public void treeWalk(Document document) {
treeWalk(document.getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
}
else {
// do something…
}
}
}
创建新的XML文件
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("books");
Element author1 = root.addElement("book")
.addAttribute("name", "三国演义")
.addAttribute("price", "100");
Element author2 = root.addElement("book")
.addAttribute("name", "西游记")
.addAttribute("price", "100");
return document;
}
}
写入文件
将 Document(或任何Node)写入文件的一种快速简便的方法是通过write()方法。
FileWriter out = new FileWriter("book.xml");
document.write(out);
out.close();
如果您希望能够更改输出的格式,例如漂亮的打印或紧凑的格式,或者您希望能够使用Writer 对象或OutputStream对象作为目标,那么您可以使用XMLWriter类。
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Foo {
public void write(Document document) throws IOException {
// 写到文件output.xml
try (FileWriter fileWriter = new FileWriter("output.xml")) {
XMLWriter writer = new XMLWriter(fileWriter);
writer.write( document );
writer.close();
}
// 将Document打印到系统(命令框)
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(System.out, format);
writer.write( document );
// 以紧凑型格式打印到系统(命令框)
format = OutputFormat.createCompactFormat();
writer = new XMLWriter(System.out, format);
writer.write(document);
writer.close();
}
}
与字符串相互转换
将Document或任一Node转化为字符串,只需要使用Document对象的方法asXML:
//document是获取到的Document或者任一Node
String text = document.asXML();
如果要把XML格式的字符串转化为Document格式,那么可以使用DocumentHelper类方法parseText(text)。
String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);
使用XSLT进行转换
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;
public class Foo {
public Document styleDocument(Document document, String stylesheet) throws Exception {
// load the transformer using JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(stylesheet));
// now lets style the given document
DocumentSource source = new DocumentSource(document);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
// return the transformed document
Document transformedDoc = result.getDocument();
return transformedDoc;
}
}