dom4j操作XML实战示例

1 下载量 167 浏览量 更新于2024-09-01 收藏 53KB PDF 举报
"这篇分享主要介绍了如何使用DOM4J库来操作XML文件,包括读取、解析和写入XML文档的示例代码。" 在Java编程中,DOM4J是一个非常流行的XML处理库,它提供了丰富的API来简化XML文档的操作。DOM4J支持多种XML处理方法,包括SAX和DOM,而这里主要展示了基于SAX的XML读取方法。下面我们将详细探讨DOM4J操作XML的相关知识点: 1. 读取XML文件: 在提供的代码中,首先创建了一个`SAXReader`实例,这是DOM4J用于解析XML文件的类。通过调用`read()`方法并传入XML文件路径,我们可以得到一个`Document`对象,它是DOM4J中表示整个XML文档的根节点。 ```java SAXReader reader = new SAXReader(); Document document = null; try { document = reader.read("D:\\itext\\27663.xml"); } catch (DocumentException e) { e.printStackTrace(); } ``` 2. 解析XML文本: 除了从文件读取XML,DOM4J还提供了`DocumentHelper.parseText()`方法,可以直接解析XML字符串。虽然在示例中没有实际使用,但这是另一种获取`Document`对象的方式。 ```java String xmlFilePath = "D:\\itext\\27663.xml"; try { document = DocumentHelper.parseText(xmlFilePath); } catch (DocumentException e) { e.printStackTrace(); } ``` 3. 遍历和操作XML元素: `Document`对象包含了XML文档的所有元素。可以通过`Element`接口来访问和修改这些元素。例如,`document.getRootElement()`可以获取XML文档的根元素,`element.elementIterator()`可以迭代遍历子元素。 ```java Element rootElement = document.getRootElement(); Iterator<Element> iterator = rootElement.elementIterator(); while (iterator.hasNext()) { Element element = iterator.next(); // 对element进行操作... } ``` 4. 处理属性和文本内容: 每个`Element`可以有多个`Attribute`,可以使用`attributeIterator()`方法来遍历。获取或设置元素的文本内容,可以使用`getText()`和`setText()`方法。 ```java for (Attribute attr : element.attributeIterator()) { System.out.println("Attribute Name: " + attr.getName() + ", Value: " + attr.getValue()); } element.setText("新的文本内容"); ``` 5. 写入XML文件: 要将修改后的`Document`对象保存回文件,我们可以使用`XMLWriter`。首先创建一个`OutputFormat`对象来指定输出格式,然后创建`XMLWriter`实例,将其输出流设置为文件输出流,最后调用`write()`方法。 ```java OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("output.xml"), "UTF-8"), format); writer.write(document); writer.close(); ``` 总结来说,DOM4J提供了一套简洁的API,使得在Java中处理XML变得容易。通过SAXReader读取XML文件,我们可以获取`Document`对象,然后遍历和操作XML结构,最后使用XMLWriter将修改写回文件。这样的操作方式既高效又灵活,适用于各种XML处理场景。
279 浏览量
package xmllab;

import java.io.File;
import java.io.FileWriter;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**

* @author Holen Chen

*/

public class Dom4jDemo {
public Dom4jDemo() {
}

/**

* 建立一个XML文档,文档名由输入属性决定

* @param filename 需建立的文件名

* @return 返回操作结果, 0表失败, 1表成功

*/

public int createXMLFile(String filename){
/** 返回操作结果, 0表失败, 1表成功 */
int returnValue = 0;
/** 建立document对象 */
Document document = DocumentHelper.createDocument();//<?xml version="1.0" encoding="UTF-8"?>
/** 建立XML文档的根books */
Element booksElement = document.addElement("books");//<books></books>
/** 加入一行注释 */
booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");//<books></books>
/** 加入第一个book节点 */
Element bookElement = booksElement.addElement("book");//<books><book></book></books>
/** 加入show属性内容 */
bookElement.addAttribute("show","yes");//<books><book show="yes"></book></books>
/** 加入title节点 */
Element titleElement = bookElement.addElement("title");//<books><book show="yes"><title></title></book></books>
/** 为title设置内容 */
titleElement.setText("Dom4j Tutorials");//<books><book show="yes"><title>Dom4j Tutorials</title></book></books>
/** 类似的完成后两个book */
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","yes");
titleElement = bookElement.addElement("title");
titleElement.setText("Lucene Studing");
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","no");
titleElement = bookElement.addElement("title");
titleElement.setText("测试");
/** 加入owner节点 */
Element ownerElement = booksElement.addElement("owner");
ownerElement.setText("O'Reilly");
try{
/** 将document中的内容写入文件中 */
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
writer.write(document);
writer.close();
/** 执行成功,需返回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}

/**
* 修改XML文件中内容,并另存为一个新文件
* 重点掌握dom4j中如何添加节点,修改节点,删除节点
* @param filename 修改对象文件
* @param newfilename 修改后另存为该文件
* @return 返回操作结果, 0表失败, 1表成功
*/

public int ModiXMLFile(String filename,String newfilename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
/** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
/** 先用xpath查找对象 */
List list = document.selectNodes("/books/book/@show" );
Iterator iter = list.iterator();
while(iter.hasNext()){
Attribute attribute = (Attribute)iter.next();
if(attribute.getValue().equals("yes")){
attribute.setValue("no");
}
}
/**
* 修改内容之二: 把owner项内容改为Tshinghua
* 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
*/
list = document.selectNodes("/books/owner" );
iter = list.iterator();
if(iter.hasNext()){
Element ownerElement = (Element)iter.next();
ownerElement.setText("Tshinghua");
Element dateElement = ownerElement.addElement("date");
dateElement.setText("2007-09-06");
dateElement.addAttribute("type","Gregorian calendar");
}

/** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */

list = document.selectNodes("/books/book");

iter = list.iterator();

while(iter.hasNext()){

Element bookElement = (Element)iter.next();

Iterator iterator = bookElement.elementIterator("title");

while(iterator.hasNext()){

Element titleElement=(Element)iterator.next();

if(titleElement.getText().equals("Dom4j Tutorials")){

bookElement.remove(titleElement);

}

}

}



try{

/** 将document中的内容写入文件中 */

XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));

writer.write(document);

writer.close();

/** 执行成功,需返回1 */

returnValue = 1;

}catch(Exception ex){

ex.printStackTrace();

}



}catch(Exception ex){

ex.printStackTrace();

}

return returnValue;

}


/**

* 格式化XML文档,并解决中文问题

* @param filename

* @return

*/

public int formatXMLFile(String filename){

int returnValue = 0;

try{

SAXReader saxReader = new SAXReader();

Document document = saxReader.read(new File(filename));

XMLWriter writer = null;

/** 格式化输出 */

OutputFormat format = OutputFormat.createPrettyPrint();

/** 指定XML编码 */

format.setEncoding("GBK");

writer= new XMLWriter(new FileWriter(new File(filename)),format);

writer.write(document);

writer.close();

/** 执行成功,需返回1 */

returnValue = 1;

}catch(Exception ex){

ex.printStackTrace();

}

return returnValue;

}



public static void main(String[] args) {

Dom4jDemo temp = new Dom4jDemo();

//System.out.println(temp.createXMLFile("d://testxml.xml"));

//System.out.println(temp.ModiXMLFile("d://testxml.xml","d://testxml2.xml"));
// try{
System.out.println(temp.formatXMLFile("d://testxml2.xml"));
// // System.out.println(temp.formatXMLFile("E:\\test.xml"));
// }
// catch(Exception e)
// {
// // e.printStackTrace();
// System.out.print("error!");
//
// }

}
}