由于工作需要,前些天学习了一下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();
}
}
分享到:
相关推荐
利用dom4j创建和解析XML文件的一个很好的例子
利用dom4j--读取xml文件。 代码简洁易懂。
里面详细讲述了如何利用dom4j来操作xml文件 并进行读写修改的操作
dom4j解析xml,利用反射机制.将解析出来的信息保存到一个类当中
JAVA解析XML文件的其中两种方式,利用dom4j.jar及JDOm.jar两种JAR包解析
简单的Dom4j解析XML文件(带注释) 并利用解析的数据访问MySql数据库
利用DOM4J写的关于XML文件的增删改查操作,工程内包含DOM4J的jar包。
前台页面展示用zTree插件,后台数据用XML保存,利用Dom4j进行解析,涉及到了对XML的增、删、改等等特别需求的技术,并用struts2+spring进行整合项目,源代码中有非常完整的注释,导入myEclipse部署运行,即可从...
全新的解析xml技术,内有源码.利用dom4j来详细的解析xml文件
通过dom4j解析xml文件或xml字符串,同时利用dom4j解析soap报文,解析出所需要的字段,使用的相对比较基础,有需要的可以参考一下。
利用dom4j解析xsd文件必不可少的两个包
通过dom4j解析配置文件,得到list集合(存放Bean标签的id和class属性) * 3.通过反射实例化得到对应的实例化对象,放置在map中(map是键值对,可根据id获取值)(遍历list获取对应的class属性,利用class。formName...
dom4j解析xml文件,利用DOM4J读取XML文件
1、xml序列化的Java3种实现方法 ...1)Dom4j的SAXValidator (dom4j.jar, javax.xml.parsers 相关类) 2)Javax.xml.validation API(Java1.5及以上) 3)Jdom(jdom.jar,xerces.jar) 4、详细说明ppt文档
使用Dom4j操作XML,然后利用反射将List列表序列成xml文件。里面有详细的注释,项目源码
java解析xml四种方式 DOM (Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的标准接口, DOM采用建立树形...目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件.
再用dom4j解析器来对xml文件进行操作,也会用到一点xpath的东西。 二:实现步骤 1.Dom4j工具类 用来简化对xml的操作: import java.io.FileOutputStream; import java.io.IOException; import org.dom4j.Document; ...
通过 利用 java 以及 dom4j 来进行XML 文件的 生成与 解析操作。代码简单易懂。
iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件; Apache PDFBox,生成、合并PDF文档; docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。 比较: iText开源协议为AGPL,而其他两个框架协议均为...
利用dom4j、sax解析xml文件、利用xpath来定位查询xml中数据