您的位置:首页 > 其它

关于xml学习(三)—— DOM4J解析

2015-01-04 16:01 363 查看
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.删除某属性

Attributeattribute=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 = newXMLWriter(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(StringxpathExpression):返回List集合
获取符合条件的单个节点
selectSingleNode(StringxpathExpression)返回一个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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: