文章目录
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;
}
}
迭代器
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;
}
}