dom4j简单学习 element和node的区别

博客分类:
对于Java解析XML有很多种方法,不过用的最多应该就是dom4j了。先来无事,稍微研究一下它。
下载地址:
目前最高版本为1.6.1。
dom4j1.6.1的完整版大约11M,是一个名为dom4j-1.6.1.zip的压缩包,解压后有一个dom4j-1.6.1.jar文件,这就是应用时需要引入的类包,另外还需要引入jaxen-1.1-beta-6.jar文件,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
import java.io.F
import java.io.FileW
import java.io.IOE
import java.net.MalformedURLE
import java.util.I
import java.util.L
import org.dom4j.A
import org.dom4j.CDATA;
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.DocumentH
import org.dom4j.DocumentT
import org.dom4j.E
import org.dom4j.N
import org.dom4j.N
import org.dom4j.ProcessingI
import org.dom4j.T
import org.dom4j.VisitorS
import org.dom4j.io.OutputF
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
* @author:kenny dong
public class Dom4JDemo {
* @param args
* @throws DocumentException
* @throws IOException
public static void main(String[] args) throws DocumentException, IOException {
Dom4JDemo demo = new Dom4JDemo();
Document doc = demo.read("D:/Demo.xml");
//demo.IteratorAllElement(demo.getRootElement(doc));
//demo.IteratorSpecialElement(demo.getRootElement(doc),"journal");
//demo.IteratorAttribute(demo.getRootElement(doc));
//demo.treeWalk(doc);
//doc.accept(new MyVisitor());
//demo.selectSingleNodeTest(doc);
demo.writeToFile(demo.createDocument());
demo.decorateOutputXML(demo.createDocument());
* read from outside
* @param fileName
* @throws MalformedURLException
* @throws DocumentException
public Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
* get root element
* @param doc
public Element getRootElement(Document doc){
return doc.getRootElement();
* iterator all element by iterator
* @param root
public void IteratorAllElement(Element root){
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
System.out.println(element.getName() + "\n" + element.asXML());
* iterator specail element by name
* @param root
* @param elementName
public void IteratorSpecialElement(Element root,String elementName){
for ( Iterator i = root.elementIterator(elementName); i.hasNext();) {
Element element = (Element) i.next();
System.out.println(element.getName() + "\n" + element.asXML());
* iterator all attributes
* @param root
public void IteratorAttribute(Element root){
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
System.out.println(attribute.getName() + "\n" + attribute.asXML());
* iterator all elements by recursion
* @param doc
public void treeWalk(Document doc) {
treeWalk(getRootElement(doc));
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i & i++){
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
System.out.println(node.asXML());
public void selectSingleNodeTest(Document doc){
Node node = doc.selectSingleNode("//journal/article");
System.out.println("select single node " + node.asXML());
public void selectNodesTest(Document document) {
List list = document.selectNodes("//journal/article" );
for(Object node : list){
if(node instanceof Element){
((Element) node).asXML();
public void findLinks(Document document) throws DocumentException {
List list = document.selectNodes("//a/@href");
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
System.out.println("url " + url);
public Document stringToDocument(String str) throws DocumentException{
return DocumentHelper.parseText(str);
public Document createDocument() {
Document document = DocumentHelper.createDocument();// create docment
Element root = document.addElement("root");// create the root Element
root.addElement("author")// create child Element
.addAttribute("name", "James")// add attribute for the child Element
.addAttribute("location", "UK")
.addText("James Strachan")
.addComment("This is the first author");// add text for the child Element
root.addElement("author")
.addAttribute("name", "Bob")
.addAttribute("location", "US")
.addText("Bob McWhirter");
System.out.println(document.asXML());
public void writeToFile(Document doc) throws IOException{
XMLWriter writer = new XMLWriter(new FileWriter("d:/output.xml"));
writer.write(doc);
writer.close();
public void decorateOutputXML(Document doc) throws IOException{
FileWriter outputStream = new FileWriter("d:/output1.xml");
format = OutputFormat.createPrettyPrint();//the default pretty printing format
//format = OutputFormat.createCompactFormat();//default compact format
//format = new OutputFormat("aaaa", false);// custom format
writer= new XMLWriter(outputStream, format );
writer.write(doc);
writer.close();
public void moidfyXML(Document doc){
Element root = doc.getRootElement();
Attribute author = root.attribute("author");// select attribute
root.remove(author);// remove attribute
root.addAttribute("user", "user_kenny");// add new attribute
class MyVisitor extends VisitorSupport {
public void visit(Element element){
System.out.println("element " + element.getName());
public void visit(Attribute attr){
System.out.println("atrribute " + attr.getName());
public void visit(Node node){
System.out.println("node " + node.asXML());
public void visit(Text text){
System.out.println("text " + text.asXML());
public void visit(ProcessingInstruction pro){
System.out.println("ProcessingInstruction " + pro.asXML());
public void visit(Namespace namespace){
System.out.println("Namespace " + namespace.asXML());
public void visit(Comment comment){
System.out.println("Comment " + comment.asXML());
public void visit(CDATA data){
System.out.println("CDATA " + data.asXML());
public void visit(DocumentType docType){
System.out.println("DocumentType " + docType.asXML());
public void visit(Document doc){
System.out.println("Document " + doc.asXML());
浏览: 113619 次
来自: 上海
这里有一套非常不错的 SparkSkin 主题皮肤,更新很频 ...
在windows 7下,需要用admin权限去运行cmd窗口, ...
其实对于非常简单的背景色设置已经够用了……
还有一个非主流的方式,直接设置opaqueBackground ...
牛,忍不住要赞你一下
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'27672人阅读
DOM4J(6)
使用dom4j解析处理html时,遇到一些麻烦的问题:
基中必须要使用XPath取得节点,有个命名空间的问题,需要如下处理:
HashMap&String, String& gm = new HashMap&String, String&();
gm.put(&xmlns&, &http://www.w3.org/1999/xhtml&);
Document rootDoc = DocumentHelper.parseText(s);
XPath xpathTable = DocumentHelper
.createXPath(&//xmlns:table[@class=\&tableList\&]&);
xpathTable.setNamespaceURIs(gm);
List&Node& tables = xpathTable.selectNodes(rootDoc);
现在取出来是Node对象(比如一个table),再往下取时,再用node1.selectNodes会取不到东西,可能还是因为命名空间的麻烦问题,所以最好转为Element,就很容易了,element1.elements(&tr&),就可以方便地循环了,比较奇怪的是转换为Element的方法居然是强转-_-!
Element table1 = (Element) tables.get(0); // 第一个表格
由此可以这样理解Node和Element,Node是节点,一个属性、一段文字、一个注释等都是节点,而Element是元素,是比较完整的一个xml的元素,即我们口头上说的xml“结点”(此处故意使用“结”字,以示与“节点”Node区别),呵呵……
dom4j帮助文档在dom4j-1.6.1/docs/guide.html文件里面,全部是英文,但是基本上应该能看懂。
1、& 四种操作xml的方式:SAX,DOM,JDOM,DOM4J.
2、& DOM(Document Object Model):意思是把整个xml做为一个整体对象,直接全部放到内存里面,不管xml文件有多大;
3、& SAX=Sample API for XML:假如xml文件有2G,用第一种方式,是很困难的,SAX用的是一种类似流媒体方式进行的。
DOM和SAX是java的API,处理xml文件的时候,相对来说是比较困难的,于是出现了下面两种框架,包装了上面两个框架。
4、& JDOM:
5、& DOM4J:
6、& 利用DOM4J解析xml文件(读取所有的属性节点)。
Document可以理解为整个文档对象
取root节点。Document.getRootElement()返回的是一个Element(元素)
7、& 理解运用xpath,path就是路径,xpath在xml文件里面找到特定的节点。
Document.selectNodes(“//hibernate-mapping/class/property”) &//其中hibenate-mapping是根节点。做变org.dom4j.Node对象返回的。
Document.selectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一个。
基中@name是property的属性名valueOf是拿出name的值;
需要加入DOM4J里面的jaxen包
8、& DOM4J的生成xml文件
9、& 用FileWriter生成xml文件的时候,可能没有格式,可以用XMLWriter类,这样自动进行美化。
10、 &DOM4J修改xml文件;很少用。
11、 &自动生成代码往往用的是:freemarker或velocity,这是常用的。用dom4j生成也很少用。
12、 &怎么用表里面的结构生成xml文件。
13、 JavaDB
a) & & & Properties对象:可以理解为一个表格对应key,value
14、 &Databasemetadata,可以能过这个JDK类,读取数据库的表结构,通过这个表结构做一些自己的事情。(熟悉用法)通过JDK文档和google学习
15、 & 元数据就是数据的数据,用来描述数据的数据。
16、 & DWR,对Ajax框架封住得比较好,是类和java的结合。
dom4j学习实例:
&&元素(Element)和结点(Node)有区别,节点包含了元素,元素一定是节点,而必须是含有完整信息的结点才是一个元素。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7718598次
积分:66374
积分:66374
排名:第29名
原创:252篇
转载:2691篇
评论:710条
(6)(73)(46)(92)(17)(25)(37)(63)(7)(74)(67)(95)(177)(113)(86)(40)(43)(71)(14)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(141)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'27674人阅读
DOM4J(6)
使用dom4j解析处理html时,遇到一些麻烦的问题:
基中必须要使用XPath取得节点,有个命名空间的问题,需要如下处理:
HashMap&String, String& gm = new HashMap&String, String&();
gm.put(&xmlns&, &http://www.w3.org/1999/xhtml&);
Document rootDoc = DocumentHelper.parseText(s);
XPath xpathTable = DocumentHelper
.createXPath(&//xmlns:table[@class=\&tableList\&]&);
xpathTable.setNamespaceURIs(gm);
List&Node& tables = xpathTable.selectNodes(rootDoc);
现在取出来是Node对象(比如一个table),再往下取时,再用node1.selectNodes会取不到东西,可能还是因为命名空间的麻烦问题,所以最好转为Element,就很容易了,element1.elements(&tr&),就可以方便地循环了,比较奇怪的是转换为Element的方法居然是强转-_-!
Element table1 = (Element) tables.get(0); // 第一个表格
由此可以这样理解Node和Element,Node是节点,一个属性、一段文字、一个注释等都是节点,而Element是元素,是比较完整的一个xml的元素,即我们口头上说的xml“结点”(此处故意使用“结”字,以示与“节点”Node区别),呵呵……
dom4j帮助文档在dom4j-1.6.1/docs/guide.html文件里面,全部是英文,但是基本上应该能看懂。
1、& 四种操作xml的方式:SAX,DOM,JDOM,DOM4J.
2、& DOM(Document Object Model):意思是把整个xml做为一个整体对象,直接全部放到内存里面,不管xml文件有多大;
3、& SAX=Sample API for XML:假如xml文件有2G,用第一种方式,是很困难的,SAX用的是一种类似流媒体方式进行的。
DOM和SAX是java的API,处理xml文件的时候,相对来说是比较困难的,于是出现了下面两种框架,包装了上面两个框架。
4、& JDOM:
5、& DOM4J:
6、& 利用DOM4J解析xml文件(读取所有的属性节点)。
Document可以理解为整个文档对象
取root节点。Document.getRootElement()返回的是一个Element(元素)
7、& 理解运用xpath,path就是路径,xpath在xml文件里面找到特定的节点。
Document.selectNodes(“//hibernate-mapping/class/property”) &//其中hibenate-mapping是根节点。做变org.dom4j.Node对象返回的。
Document.selectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一个。
基中@name是property的属性名valueOf是拿出name的值;
需要加入DOM4J里面的jaxen包
8、& DOM4J的生成xml文件
9、& 用FileWriter生成xml文件的时候,可能没有格式,可以用XMLWriter类,这样自动进行美化。
10、 &DOM4J修改xml文件;很少用。
11、 &自动生成代码往往用的是:freemarker或velocity,这是常用的。用dom4j生成也很少用。
12、 &怎么用表里面的结构生成xml文件。
13、 JavaDB
a) & & & Properties对象:可以理解为一个表格对应key,value
14、 &Databasemetadata,可以能过这个JDK类,读取数据库的表结构,通过这个表结构做一些自己的事情。(熟悉用法)通过JDK文档和google学习
15、 & 元数据就是数据的数据,用来描述数据的数据。
16、 & DWR,对Ajax框架封住得比较好,是类和java的结合。
dom4j学习实例:
&&元素(Element)和结点(Node)有区别,节点包含了元素,元素一定是节点,而必须是含有完整信息的结点才是一个元素。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7718600次
积分:66374
积分:66374
排名:第29名
原创:252篇
转载:2691篇
评论:710条
(6)(73)(46)(92)(17)(25)(37)(63)(7)(74)(67)(95)(177)(113)(86)(40)(43)(71)(14)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(141)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'用户名:smilezhuolin
文章数:78
访问量:13105
注册日期:
阅读量:1297
阅读量:3317
阅读量:580914
阅读量:464572
51CTO推荐博文
Document doc = DocumentHelper.parseText(getXmlString());&1& 返回多个节点 nodeList = doc.SelectNodes(&/group/person&); & &返回一个则可以使用node = doc.SelectSingleNode(&/group/person&);&2& 在使用不规则的层次文档时,不知道中间层次元素,可以使用//符号来越过中间的节点,查询子孙多层次下的其他所有元素: & &nodeList = doc.SelectNode(&/group//name&);&3& 查询节点的属性 & &nodeList = doc.SelectNodes(&/group/person/@id&);&4& 使用text()来获取节点内容 & &node = doc.SelectSingleNode(&/group/person/name/text()&);&5& 返回某属性的节点 & &node = doc.SelectSingleNode(&/group/person[@id='10002']&);&6& 返回节点内容相符的节点 & &node = doc.SelectSingleNode(&/group/person/name[text()='zhangsan']&);&7& 使用 | 符号可以获得多重模式的节点 & &nodeList = doc.SelectNodes(&/group/person[@id='10002'] | /group/person[@id='10003']&);&8& 新建xml & &Element root = DocumentHelper.createElement(&group&); & &Document doc = DocumentHelper.createDocument(root); & &Element person1 = root.addElement(&person&); & &Element name1 = person1.addElement(&name&); & &name1.setText(&zhuolin&); & &Element age1 = person1.addElement(&age&); & &age1.setText(&23&); & &person1.addAttribute(&id&, &10002&); & &syso(doc.asXML());本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

 

随机推荐