Dom4j
是一个简单、灵活的开放源代码的库。
Dom4j
是由早期开发
JDOM
的人分离出来而后独立开发的。与
JDOM
不同的是,
dom4j
使用接口和抽象基类,虽然
Dom4j
的
API
相对要复杂一些,但它提供了比
JDOM
更好的灵活性。
使用
Dom4j
开发,需下载
dom4j
相应的
jar
文件
Document对象:
DOM4j
中,获得
Document
对象的方式有三种:
1.
读取
XML
文件
,
获得
document
对象
SAXReader reader = newSAXReader(); Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document对象
String text = "<members></members>"; Document document =DocumentHelper.parseText(text);
3.主动创建document对象.
Documentdocument = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
实例:
节点对象:
1.
获取文档的根节点
.
Element root =document.getRootElement();
2.
取得某个节点的子节点
.
Elementelement=node.element(“书名");
3.
取得节点的文字
String text=node.getText();
4.
取得某节点下所有名为“
member”
的子节点,并进行遍历
List nodes = rootElm.elements("member"); for (Iterator it =nodes.iterator();it.hasNext();) { Element elm =(Element) it.next(); // dosomething }
5.
对某节点下的所有子节点进行遍历
.
for(Iterator it=root.elementIterator();it.hasNext();){ Element element = (Element)it.next(); //do something } 6.在某节点下添加子节点. Element ageElm =newMemberElm.addElement("age");
7.
设置节点文字
element.setText
("29");
8.
删除某节点
//
childElm
是待删除的节点
,
parentElm
是其父节点
parentElm.remove(childElm);//从父节点删掉子节点,而不是从子节点删掉父节点
9.
添加一个
CDATA
节点
Element
contentElm
=
infoElm.addElement
("content");
contentElm.addCDATA
(
diary.getContent
());
节点对象属性:
1.
取得某节点下的某属性
Element root=document.getRootElement(); //属性名name
Attribute attribute=root.attribute("size");
2.
取得属性的文字
String text=attribute.getText();
3.
删除某属性
Attribute
attribute
=
root.attribute
("size");
root.remove
(attribute);
3.
遍历某节点的所有属性
Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute =(Attribute)it.next(); String text=attribute.getText(); System.out.println(text); }
4.
设置某节点的属性和文字
.
newMemberElm.addAttribute
("name","
sitinspring
");
5.
设置属性的文字
Attribute
attribute
=
root.attribute
("name");
attribute.setText("sitinspring");
将文档写入XML文件:
1.
文档中全为英文
,
不设置编码
,
直接写入的形式
.
XMLWriter
writer = new
XMLWriter
(new
FileWriter
("output.xml"));
writer.write
(document);
writer.close
();
2.
文档中含有中文
,
设置编码格式写入的形式
.
OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码
format.setEncoding("GBK"); XMLWriterwriter = newXMLWriter(newFileWriter("output.xml"),format); writer.write(document); writer.close();
Dom4j在指定位置插入节点:
1.
得到插入位置的节点列表(
list
)
2.
调用
list.add
(
index,elemnent
)
,由
index
决定
element
的插入位置。
Element
元素可以通过
DocumentHelper
对象得到。 示例代码:
Element aaa =DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List list =root.element("书").elements();
list.add(1,aaa);
//更新document
字符串与XML的转换:
1.
将字符串转化为
XML
String text = "<members> <member>sitinspring</member></members>";
Document document =DocumentHelper.parseText(text);
2.
将文档或节点的
XML
转化为字符串
.
SAXReader reader = newSAXReader(); Document document =reader.read(newFile("input.xml")); Element root=document.getRootElement(); String docXmlText=document.asXML();//把文档的XML转化为字符串
String rootXmlText=root.asXML();//把根节点转化为字符串 Element memberElm=root.element("member"); String memberXmlText=memberElm.asXML();//把所有member子节点转化为字符串
XPath:
XPath可用来在XML文档中对元素和属性进行遍历,简化了Dom4j查找节点的过程
注意:使用
XPath
必须导入
jaxen-1.1-beta-6.jar
,否则出现 :
NoClassDefFoundError
: org/
jaxen
/
JaxenException
查询节点:
获取所有符合条件的节点
selectNodes
(String
xpathExpression
)
:返回
List
集合
获取符合条件的单个节点
selectSingleNode
(String
xpathExpression
)
返回一个
Node
对象。 如果符合条件的节点有多个,那么返回第一个
。
设置命名空间
reader.getDocumentFactory
()
.
setXPathNamespaceURIs
(
Map)
key
:别名(与
schema
中可以不同,默认也需要起名)
value
:命名空间的
URL
rootElement.elementByID
(“b001”);XML
文档中
ID
属性必须大写
实例:
XPathTest.java:
<span style="font-size:14px;">package com.example.dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class XPathTest {
public static void main(String[] args) throws Exception {
// 获取解析流
SAXReader reader = new SAXReader();
// 解析xml文件
Document document = reader.read("Book.xml");
// 查询id为b002的元素
Node node = document.selectSingleNode("//book[@id='b002']");
System.out.println(node);
}
}
</span>
dom4jTest.java:
<span style="font-size:14px;">package com.example.dom4j;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.example.domain.Book;
public class dom4jTest {
public static void main(String[] args) throws Exception {
// 需要list存放所有的book对象
List allBook = new ArrayList();
// 获取解析流
SAXReader reader = new SAXReader();
// 解析xml文件
Document document = reader.read("book.xml");
// 获取根元素
Element rootElement = document.getRootElement();
// 获取所有的书籍
List bookList = rootElement.elements();
for (int e = 0; e < bookList.size(); e++) {
Book book = new Book();
// 获取每一本书
Element bookElement = (Element) bookList.get(e);
String id = bookElement.attributeValue("id");
book.setId(id);
// 获取每本书的所有元素:title和price
List childList = bookElement.elements();
for (int i = 0; i < childList.size(); i++) {
// 获得每一个子元素
Element child = (Element) childList.get(i);
// 获取子元素的文本内容
String content = child.getText();
// 获取title
if ("title".equals(child.getName())) {
book.setTitle(content);
}
// 获取price
if ("price".equals(child.getName())) {
book.setPrice(content);
}
}
allBook.add(book);
}
System.out.println(allBook);
}
}
</span>
CURDTest.java:
<span style="font-size:14px;">package com.example.dom4j;
import java.io.FileOutputStream;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class CURDTest {
public static void main(String[] args) throws Exception {
// 获取解析流
SAXReader reader = new SAXReader();
// 解析xml文件
Document document = reader.read("Book.xml");
//…………
// 将document另存
// 创建文件保存位置
FileOutputStream fos = new FileOutputStream("Book.dom4j.xml");
XMLWriter writer = new XMLWriter(fos);
writer.write(document);
writer.close();
}
private static void add() throws Exception {
// 获取解析流
SAXReader reader = new SAXReader();
// 解析xml文件
Document document = reader.read("Book.xml");
// 添加:
// 获得根元素
Element rootElement = document.getRootElement();
// 创建book元素
Element newBook = DocumentHelper.createElement("book");
// 创建属性
Attribute newBookAttribute = DocumentHelper.createAttribute(newBook,"id","b004");
// 将属性添加到newBook中
newBook.add(newBookAttribute);
// 创建newBook中的元素
Element titleElement = DocumentHelper.createElement("title");
titleElement.setText("C和指针");
// 将元素添加进newBook中
newBook.add(titleElement);
// 将newBook添加如root中
rootElement.add(newBook);
// 将document另存
// 创建文件保存位置
FileOutputStream fos = new FileOutputStream("Book.dom4j.xml");
XMLWriter writer = new XMLWriter(fos);
writer.write(document);
writer.close();
}
private static void delete(Document document) throws Exception {
// 删除:b001
Node bookNode = document.selectSingleNode("//book[@id='b001']");
Node parent = bookNode.getParent();
Element parentElement = (Element) parent;
parentElement.remove(bookNode);
// 将document另存
// 创建文件保存位置
FileOutputStream fos = new FileOutputStream("Book.dom4j.xml");
XMLWriter writer = new XMLWriter(fos);
writer.write(document);
writer.close();
}
private static void update(Document document) throws Exception {
// 修改:b002 title 编程思想
Node bookNode = document.selectSingleNode("//book[@id='b002']");
Element bookElement = (Element) bookNode;
Element titleElement = bookElement.element("title");
// System.out.println(titleElement.getText());
titleElement.setText("编程思想");
// 将document另存
// 创建文件保存位置
FileOutputStream fos = new FileOutputStream("Book.dom4j.xml");
XMLWriter writer = new XMLWriter(fos);
writer.write(document);
writer.close();
}
private static void sava(Document document) throws Exception {
//保存
// 将document另存
// 创建文件保存位置
FileOutputStream fos = new FileOutputStream("Book.dom4j.xml");
XMLWriter writer = new XMLWriter(fos);
writer.write(document);
writer.close();
}
}
</span> (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|