由于工作需要,前些天学习了一下dom4j,当然在网上也查了很多资料,有一篇文章给了我很大帮助,算是启蒙吧,本想把它的地址贴出来的,却找不到了,不过还是很感谢。
import org.dom4j.Document;
import java.util.List;
import java.util.Iterator;
import org.dom4j.Element;
import org.dom4j.Attribute;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.io.IOException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
public class XmlFile {
/**
* 载入一个文件
* 不只限于.xml,也可是.txt等
* */
public static Document loadFile(String filename) {
Document document = null;
try {
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(filename));
} catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
/**
* 添加节点
* <database>
* <station>
* <datasource name="" laststarttime="" lastendtime=""/>
* <datasource name="" laststarttime="" lastendtime=""/>
* </station>
*</database>
* 添加一个新的结点,(一行<datasource name="" laststarttime="" lastendtime=""/>)
* fileName:文件名,node[]:节点(以上面的文件为例,添加一个新的 datasource ,node[]={"station","datasource"}),attribute[]:Attribute列表(以上面的文件为例,attribute[]={"name","laststarttime","lastendtime"})
* */
public static void xmlAddNode(String fileName, String[] node,
String[] attribute, String[] value) {
Document doc = loadFile(fileName);
Element element = doc.getRootElement();
for (int i = 0; i < node.length - 1; i++) {
element = element.element(node[i]);
}
element = element.addElement(node[node.length - 1]);
for (int i = 0; i < attribute.length; i++) {
element.addAttribute(attribute[i], value[i]);
}
try {
saveDoc(doc, fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*输出文件中所有具体节点的数据
* 例如文件格式如下
* SelectFromXML.xml
* <?xml version="1.0" encoding="GBK"?>
* <SelectDefineByXML>
* <select name="dbsource">
* <item option="jdbc/3309"/>
* <item option="jdbc/3307"/>
* </select>
* </SelectDefineByXML>
* 读取/SelectDefineByXML/select/item里option的值
* fileName文件名,rootnode根节点,attributename要读取的Attribute
* 调用方式:xmlRead("/SelectFromXML.xml","/SelectDefineByXML/select/item","option");
* 同parserXML(String fileName)功能一样,只是parserXML有返回值
* */
public static void xmlRead(String fileName, String rootnode,
String attributename) {
Document doc = loadFile(fileName);
List list = doc.selectNodes(rootnode);
Iterator it = list.iterator();
while (it.hasNext()) {
Element element = (Element) it.next();
Attribute intem = element.attribute(attributename);
System.out.println(attributename + ":" + intem.getValue());
}
}
/**
*根据某一特定数据读取/修改文件中某一具体节点的数据
* 例如文件格式如下
* <?xml version="1.0" encoding="GBK"?>
* <database>
* <station>
* <datasource name="jdbc/3307" laststarttime="2007-10-29 17:11:19" lastendtime="2007-10-29 16:40:20"/>
* <datasource name="jdbc/3308" laststarttime="2007-10-29 16:46:28" lastendtime="2007-10-29 16:40:30"/>
* </station>
* </database>
* 根据name的值读取/修改lastendtime的值
* fileName文件名,rootnode根节点(如:/database/station/datasource)
* attributename要读取的Attribute名(如:lastendtime)
* referenceattribute参考Attribute名(如:name)
* referencevalue参考Attribute的值
* attributevalue修改时attributename要改为的值
* mod:true 修改,false:读取
* 调用方式:lastendtime = xmlfile.xmlReadOrMod("/databaselog.xml","/database/station/datasource","lastendtime","name","jdbc/3007","2007-11-1 10:18:57", true);
* */
public static String xmlReadOrMod(String fileName, String rootnode,
String attributename,
String referenceattribute,
String referencevalue,
String attributevalue, boolean mod) {
String result = "";
Document doc = loadFile(fileName);
List list = doc.selectNodes(rootnode);
Iterator it = list.iterator();
while (it.hasNext()) {
Element element = (Element) it.next();
Attribute endnode_ = element.attribute(attributename);
Attribute reference_ = element.attribute(referenceattribute);
if (reference_.getValue().equals(referencevalue)) {
result = endnode_.getValue();
if (mod) {
try {
endnode_.setValue(attributevalue);
saveDoc(doc, fileName);
break;
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
}
return result;
}
/**
*读取文件中所有具体节点的数据
* 例如文件格式如下
* <?xml version="1.0" encoding="GBK"?>
* <SelectDefineByXML>
* <select name="dbsource">
* <item option="jdbc/3309"/>
* <item option="jdbc/3307"/>
* </select>
* </SelectDefineByXML>
* 读取rootnode(select)/node(item)里attribute(option)的值
* 同xmlRead(String fileName)功能一样,只是xmlRead没有返回值
* 如果要得到option的值,方法调用的时候:parserXML("文件名","select","item", "option");
* */
public List parserXML(String fileName, String rootnode, String node,
String attribute) {
ArrayList list = new ArrayList();
try {
Document doc = loadFile(fileName);
Element root = doc.getRootElement();
// 解析rootnode集合
for (Iterator i = root.elementIterator(rootnode); i.hasNext(); ) {
Element select = (Element) i.next();
Iterator k = select.elementIterator(node);
while (k.hasNext()) {
Element item = (Element) k.next();
Attribute aOption = item.attribute(attribute);
list.add(aOption.getValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 同parserXML(String fileName, String rootnode, String node,String attribute)作用一样
* 同parserXML的区别,parserXmlRead从类路径读取文件
*/
public List parserXmlRead(String fileName, String rootnode, String node,
String attribute) {
ArrayList list = new ArrayList();
try {
// 从类路径读取配置文件。
InputStream stream = getClass().getResourceAsStream(
fileName);
SAXReader reader = new SAXReader();
Document doc = reader.read(stream);
Element root = doc.getRootElement();
// 解析rootnode集合
for (Iterator i = root.elementIterator(rootnode); i.hasNext(); ) {
Element select = (Element) i.next();
Iterator k = select.elementIterator(node);
while (k.hasNext()) {
Element item = (Element) k.next();
Attribute aOption = item.attribute(attribute);
System.out.println(aOption.getValue());
list.add(aOption.getValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
*读取/修改某个节点的数据
* 文件格式如下:
* <?xml version="1.0" encoding="GBK"?>
* <database>
* <center>
* <datasource>
* <name>db0000</name>
* </datasource>
* </center>
* </database>
* 读取/修改name的值(database/center/datasource的name值),filename文件名,rootnode根节点
* 当mod=true时修改
* 适用于取得单个值
* */
public static String xmlReadOrMod(String filename, String node, boolean mod,
String modvalue) {
Document doc = loadFile(filename);
/** 直接取得 node 的值 */
List list = doc.selectNodes(node);
Iterator it = list.iterator();
String result = "";
Element hostElement = (Element) it.next();
result = hostElement.getText();
//如果mod=true那么修改并保存
if (mod) {
System.out.println(mod);
hostElement.setText(modvalue);
try {
saveDoc(doc, filename);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(hostElement.getText());
return result;
}
/**
*修改某个节点的数据
* 文件格式如下:
* <?xml version="1.0" encoding="GBK"?>
* <database>
* <station>
* <datasource>
* <name>888</name>
* <name>111</name>
* <name>222</name>
* <name>333</name>
* </datasource>
* </station>
* </database>
* 读取name的值(database/station/datasource/name值),如果某一个值==recvalue,则修改为value
* filename文件名,node节点,返回String
* */
public static void xmlMod(String filename, String node, String recvalue,
String value) {
Document doc = loadFile(filename);
/** 直接取得 node 的值 */
List list = doc.selectNodes(node);
Iterator it = list.iterator();
while (it.hasNext()) {
Element hostElement = (Element) it.next();
System.out.println("hostElement=" +
hostElement.getText());
//修改node的值
if (hostElement.getText().equals(recvalue)) {
hostElement.setText(value);
try {
saveDoc(doc, filename);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
*读取/修改某个节点的数据
* 文件格式如下:
* <?xml version="1.0" encoding="GBK"?>
* <database>
* <center>
* <datasource name="db0000"/>
* </center>
* </database>
* 读取/修改name的值(database/center/datasource/@name值)
* filename文件名,node节点,返回String
* mod:true 修改,false 读取
* modvalue修改值
* */
public static String xmlMod(String filename, String node, boolean mod,
String modvalue) {
Document doc = loadFile(filename);
/** 直接取得 node 的值 */
List list = doc.selectNodes(node);
Iterator it = list.iterator();
String result = "";
if (it.hasNext()) {
Attribute attribute = (Attribute) it.next();
result = attribute.getValue();
//修改node的值
if (mod) {
try {
attribute.setValue(modvalue);
saveDoc(doc, filename);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
/**
*读取文件中所有具体节点的数据
* 例如文件格式如下
* <?xml version="1.0" encoding="GBK"?>
* <SelectDefineByXML>
* <select name="dbsource">
* <item option="jdbc/3309"/>
* <item option="jdbc/3307"/>
* </select>
* </SelectDefineByXML>
* 读取/SelectDefineByXML/select/item里option的值
* 同 xmlRead(String fileName),parserXML(String fileName) 功能一样
* */
public static void xmlReadNode(String filename, String rootnode,
String node) {
Document doc = loadFile(filename);
List list = doc.selectNodes(rootnode);
Iterator it = list.iterator();
/** 直接用属性path取得name值 */
list = doc.selectNodes(rootnode + "/@" + node);
it = list.iterator();
while (it.hasNext()) {
Attribute attribute = (Attribute) it.next();
System.out.println("@node=" + attribute.getValue());
}
}
/**
* 保存XML文档
* @param doc
* @throws IOException
*/
public static void saveDoc(Document doc, String savefilename) throws
IOException {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream(savefilename),
format);
writer.write(doc);
writer.close();
}
}
分享到:
相关推荐
在这个示例中,我们将深入探讨如何利用Maven管理和DOM4j来操作XML文件。 首先,让我们了解一下Maven。Maven是Apache软件基金会的一个项目,它通过定义项目对象模型(Project Object Model,POM)来管理项目的构建、...
### 使用Dom4j读取XML文件的方法详解 #### 一、引言 在Java开发过程中,经常需要处理各种格式的数据文件,其中XML(可扩展标记语言)作为一种标准的数据交换格式被广泛使用。为了高效地解析和操作XML文档,开发者...
《深入解析DOM4J 2.1.3》 DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档对象模型(DOM)、简单API(SAX)以及...通过深入学习和实践,你可以充分利用DOM4J的强大功能,提升你的XML处理能力。
本示例将详细介绍如何利用DOM4J进行XML文件的操作,包括创建XML文档、解析XML内容以及对XML元素的增删改查。 首先,我们需要理解XML(Extensible Markup Language)的基本概念。XML是一种自描述性的标记语言,常...
总结起来,`dom4j`是解析XML文件的强大工具,而`ActionWrapper`、`PackageWrapper`和`ResultWrapper`则是对`struts.xml`配置信息的抽象,它们有助于简化和优化Struts2应用的配置管理。通过使用这些包装类,我们可以...
在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...
下面我们将详细介绍如何利用Dom4j解析`struts.xml`文件中的关键元素。 首先,导入必要的库,包括Dom4j库和其他Struts2依赖。在你的项目中,确保添加了以下Maven依赖: ```xml <groupId>dom4j <artifactId>dom4j...
在实际开发中,DOM4J常用于XML配置文件的读写,如Spring框架的配置文件处理。此外,它还广泛应用于数据交换、XML数据的序列化与反序列化,以及XML文档的转换等场景。 五、API使用示例 以下是一个简单的示例,展示...
在本文中,我们将详细探讨如何利用DOM4J库来读取XML文件。 1. **安装DOM4J** 要使用DOM4J,首先需要将其添加到你的项目依赖中。如果你使用的是Maven,可以在`pom.xml`文件中添加以下依赖: ```xml <groupId>...
在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...
在这个项目中,我们利用DOM4J来解析XML文件,并通过Java的反射机制将解析出的信息存储到特定的类中。 首先,我们需要了解XML的基本概念。XML(Extensible Markup Language)是一种标记语言,常用于数据交换和结构化...
1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即Document对象。解析器有SAX和DOM两种模式,SAX是事件驱动的,适用于大文件,而DOM则将整个文档加载到内存中,适合小文件。 2. **创建XML**:DOM4...
DOM4J是一个强大的Java库,专门用于处理XML文档。它是一个灵活且高性能的XML解析器,提供了丰富的API来创建、修改和...通过解压并将其添加到项目中,开发者可以利用DOM4J提供的丰富功能,提高XML处理的效率和便利性。
Dom4J作为一款优秀的Java XML API,以其简洁、高效的特点,在生成、解析和操作XML文档方面表现突出。本文将深入探讨如何使用Dom4J库来创建XML文档,包括初始化文档、添加元素、设置属性、插入文本以及最终保存文档至...
本教程将详细讲解如何利用DOM4J进行XML文件的创建和读取。首先,我们需要了解DOM4J的核心概念,如Element、Attribute、Document等。 1. **DOM4J基本概念**: - **Document**: XML文档的根节点,代表整个XML文件。 ...
2. **SAX和DOM**: 除了DOM,DOM4J还支持SAX解析器,允许在内存有限的情况下处理大型XML文件。 3. **XPath**: 支持XPath表达式,使得可以方便地定位和提取XML文档中的特定节点。 4. **事件模型**: 提供了基于事件的...
这个JAR文件包含了DOM4J的所有类和资源,使得开发者能够将其引入到自己的Java项目中,以便利用DOM4J的功能。 描述中提到"dom4j.jar包用于解析xml文档使用,已经验证,解压引入工程即可使用",这说明DOM4J的主要用途...
与DOM(Document Object Model)相比,dom4j通常被认为更轻量级,内存占用更少,因此在处理大型XML文件时更有优势。此外,dom4j的API设计更加面向对象,使得代码更易读写和维护。 总结来说,dom4j是一个强大的XML...
在本文中,我们将深入探讨如何利用DOM4J进行XML文件的读取、写入和修改操作。 一、XML基础 XML(Extensible Markup Language)是一种标记语言,用于存储和传输结构化数据。它具有自解释性,使得数据在不同的系统间...
在本示例中,"dom4jExample.java"是一个Java程序,它展示了如何利用DOM4J库来操作XML文件。 首先,我们需要了解DOM4J的基本概念。DOM4J采用Document Object Model (DOM)接口,但它的实现比标准DOM更快,占用内存更...