dom4j使用方法详解
本文先做知识点的简单介绍,最后附完整案例。
一、解析XML文件
public class Foo {
//url为XML文档地址
//自己封装了一个工具类 返回解析完成的document
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
二、利用JAVA的iterator来导航文档(遍历文档)
public void bar(Document document) throws DocumentException { Element root = document.getRootElement(); // 从根节点开始遍历
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element element = it.next();
// do something
} // 从根节点的名为“foo”的子节点开始遍历
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
// do something
} // 遍历根节点的属性
for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next();
// do something
}
}
三、在<dom4j>中,可以在Document或树中的任何节点(例如Attribute,Element)上计算XPath表达式。 这允许使用单行代码在整个文档中进行复杂导航
public void bar(Document document) {
List<Node> list = document.selectNodes("//foo/bar"); Node node = document.selectSingleNode("//foo/bar/author"); //获取node节点的name属性值
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文档
public class Foo { public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
//创建root的子节点 并添加相关的属性值
Element author1 = root.addElement("author")
.addAttribute("name", "James")
.addAttribute("location", "UK")
.addText("James Strachan");
//创建root的子节点 并添加相关的属性值
Element author2 = root.addElement("author")
.addAttribute("name", "Bob")
.addAttribute("location", "US")
.addText("Bob McWhirter"); return document;
}
}
六、将创建好的文档保存至磁盘
public class Foo { public void write(Document document) throws IOException { // 保存至output.xml
try (FileWriter fileWiter = new FileWriter("output.xml")) {
XMLWriter writer = new XMLWriter(fileWriter);
writer.write( document );
writer.close();
} // 以格式化的形式保存 有缩进...
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(System.out, format);
writer.write( document );
}
}
tips:
- 将字符串转化为XML文档
String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);
七、利用XSLT转换XML
<!-- XML-->
<PHONEBOOK>
<PERSON>
<NAME>Joe Wang</NAME>
<EMAIL>joe@yourserver.com</EMAIL>
<TELEPHONE>202-999-9999</TELEPHONE>
<WEB>www.w3cschool.cn</WEB>
</PERSON>
<PERSON>
<NAME>Karol</NAME>
<EMAIL>karol@yourserver.com</EMAIL>
<TELEPHONE>306-999-9999</TELEPHONE>
<WEB>www.w3cschool.cn</WEB>
</PERSON>
<PERSON>
<NAME>Green</NAME>
<EMAIL>green@yourserver.com</EMAIL>
<TELEPHONE>202-414-9999</TELEPHONE>
<WEB>www.w3cschool.cn</WEB>
</PERSON>
</PHONEBOOK>
<!-- xslt-->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>Directory</title>
</head>
<body> <table border="1"> <tr>
<th>Name</th>
<th>Telephone</th>
<th>Email</th>
</tr> <xsl:for-each select="PHONEBOOK/PERSON">
<xsl:sort />
<tr>
<td>
<xsl:value-of select="NAME" />
</td>
<td>
<xsl:value-of select="TELEPHONE" />
</td>
<td>
<xsl:value-of select="EMAIL" />
</td>
</tr>
</xsl:for-each> </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
public class XSLTTest {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
try {
Document document = reader.read("phonebook.xml"); TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource("style1.xsl")); DocumentSource source = new DocumentSource(document);
DocumentResult result = new DocumentResult();
transformer.transform(source, result);
Document doc = result.getDocument(); OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(System.out, format);
writer.write(doc);
writer.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
转换结果
<?xml version="1.0" encoding="UTF-8"?> <html>
<head>
<title>Directory</title>
</head>
<body>
<table border="1">
<tr>
<th>Name</th>
<th>Telephone</th>
<th>Email</th>
</tr>
<tr>
<td>Green</td>
<td>202-414-9999</td>
<td>green@yourserver.com</td>
</tr>
<tr>
<td>Joe Wang</td>
<td>202-999-9999</td>
<td>joe@yourserver.com</td>
</tr>
<tr>
<td>Karol</td>
<td>306-999-9999</td>
<td>karol@yourserver.com</td>
</tr>
</table>
</body>
</html>
dom4j使用方法详解的更多相关文章
- session的使用方法详解
session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...
- Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解
下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- ecshop后台增加|添加商店设置选项和使用方法详解
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- windows.open()、close()方法详解
windows.open()方法详解: window.open(URL,name,features,replace)用于载入指定的URL到新的或已存在的窗口中,并返回代表新窗口的Win ...
- CURL使用方法详解
php采集神器CURL使用方法详解 作者:佚名 更新时间:2016-10-21 对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- lambda和委托那点事
Lambda 简介 Lambda 表达式是一种可用于创建委托或表达式目录树类型的一种匿名函数(匿名方法+Lambda).通过使用 lambda 表达式,可以写入可作为参数传递或作为函数 调用值返回的本 ...
- linux 经常使用网络命令
1. ifconfig ifconfig主要是能手动启动.观察和改动网络接口的相关參数.能改动的參数许多,包含IP參数及MTU等都能改动,他的语法例如以下: [root@linux ~]# ifco ...
- [办公应用]如何打印较小边距的PPT讲义(或者每页打印16页)
关键词:打印 PPT 讲义 4张 边距 今天同事问我如何打印PowerPoint的讲义.她自己使用PowerPoint打印讲义,设置每页4张,但是页边距太大:觉得浪费很大. 经过网上查阅后,现将方 ...
- 【bzoj1150】[CTSC2007]数据备份Backup
将k对点两两相连,求最小长度 易证得,最优方案中,相连的办公楼一定是取相邻的比取不相邻的要更优 然后就可以用贪心来做这道题了.. 将初始所有的线段放进堆里 每次取最短的线段进行连接,且ans+=a[i ...
- 混合使用Delphi和C ++(附下载)
您想将C ++添加到Delphi应用程序中吗?或者将Delphi代码添加到C ++应用程序中?这是如何做. 您可能不知道的一件事是如何在RAD Studio中集成C ++和Delphi语言.您可以将单 ...
- NTFS文件系统的单个文件最大到底有多大?
于NTFS文件系统的单个文件最大到底有多大? 闲来无事突然想到这个问题,到网上搜索了一下也没有一个固定的解释. 于是到微软官方知识库去寻找答案: 注意:基础硬件限制可能会对任何文件系统施加额外的分区大 ...
- Python 常用算法记录
一.递归 汉诺塔算法:把A柱的盘子,移动到C柱上,最少需要移动几次,大盘子只能在小盘子下面 1.当盘子的个数为n时,移动的次数应等于2^n – 1 2.描述盘子从A到C: (1)如果A只有一个圆盘,可 ...
- 2017年最新VOS2009/VOS3000最新手机号段导入文件(手机归属地数据)
VOS2009.vos3000.vos5000最新手机号段归属地数据库导入文件. 基于2017年4月最新版手机号段归属地制作 共360569条记录,兼容所有版本的昆石VOS,包括VOS2009.vos ...
- PHP cURL使用小结
cURL简介 cURL是什么? cURL(Client URL Library Functions)由 Daniel Stenberg 创建的libcurl库,官方定义为:curl is a comm ...
- HTML5移动Web开发
1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...