加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:21:42 所属栏目:百科 来源:网络整理
导读:Dom4j 是一个简单、灵活的开放源代码的库。 Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。与 JDOM 不同的是, dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。 使用 Dom4j 开发,需下载 dom4j 相应


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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读