package lxq;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Attribute;
import java.util.List;
import java.util.Iterator;
import org.dom4j.io.XMLWriter;
import java.io.*;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Dom4jTest
{
/**
* 创建一个xml文件
*/
public void generateDocument()
{
// 使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API
// 工厂类。
Document document = DocumentHelper.createDocument();
// 使用 addElement() 方法创建根元素 catalog 。 addElement() 用于向 XML 文档中增加元素。
Element catalogElement = document.addElement("catalog");
// 在 catalog 元素中使用 addComment() 方法添加注释“An XML catalog”。
catalogElement.addComment("An XML Catalog");
// 在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令。
catalogElement.addProcessingInstruction("target", "text");
// 在 catalog 元素中使用 addElement() 方法增加 journal 元素。
Element journalElement = catalogElement.addElement("journal");
// 使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性。
journalElement.addAttribute("title", "XML Zone");
journalElement.addAttribute("publisher", "IBM developerWorks");
// 向 article 元素中添加 journal 元素。
Element articleElement = journalElement.addElement("article");
// 为 article 元素增加 level 和 date 属性。
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2001");
// 向 article 元素中增加 title 元素。
Element titleElement = articleElement.addElement("title");
// 使用 setText() 方法设置 article 元素的文本。
titleElement.setText("Java configuration with XML Schema");
// 在 article 元素中增加 author 元素。
Element authorElement = articleElement.addElement("author");
// 在 author 元素中增加 firstname 元素并设置该元素的文本
Element firstNameElement = authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
Element lastNameElement = authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");
/*
* 可以使用 addDocType() 方法添加文档类型说明。 这样就向 XML 文档中增加文档类型说明: <!DOCTYPE catalog
* SYSTEM "file://c:/Dtds/catalog.dtd">
*/
document.addDocType("catalog", null, "file://c:/Dtds/catalog.dtd");
try
{
XMLWriter output = new XMLWriter(new FileWriter(new File(
"c:/catalog.xml")));
output.write(document);
output.close();
} catch (IOException e)
{
System.out.println(e.getMessage());
}
}
/**
* 修改xml文件
*/
public void modifyDocument(File inputXml)
{
try
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(inputXml);
List list = document.selectNodes("//article/@level");
Iterator iter = list.iterator();
while (iter.hasNext())
{
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("Intermediate"))
attribute.setValue("Introductory");
}
list = document.selectNodes("//article/@date");
iter = list.iterator();
while (iter.hasNext())
{
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("December-2001"))
attribute.setValue("October-2002");
}
list = document.selectNodes("//article");
iter = list.iterator();
while (iter.hasNext())
{
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("title");
while (iterator.hasNext())
{
Element titleElement = (Element) iterator.next();
if (titleElement.getText().equals(
"Java configuration with XMLSchema"))
titleElement
.setText("Create flexible and extensible XML schema");
}
}
list = document.selectNodes("//article/author");
iter = list.iterator();
while (iter.hasNext())
{
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("firstname");
while (iterator.hasNext())
{
Element firstNameElement = (Element) iterator.next();
if (firstNameElement.getText().equals("Marcello"))
firstNameElement.setText("Ayesha");
}
}
list = document.selectNodes("//article/author");
iter = list.iterator();
while (iter.hasNext())
{
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("lastname");
while (iterator.hasNext())
{
Element lastNameElement = (Element) iterator.next();
if (lastNameElement.getText().equals("Vitaletti"))
lastNameElement.setText("Malik");
}
}
XMLWriter output = new XMLWriter(new FileWriter(new File(
"c:/catalog/catalog-modified.xml")));
output.write(document);
output.close();
}
catch (DocumentException e)
{
System.out.println(e.getMessage());
} catch (IOException e)
{
System.out.println(e.getMessage());
}
}
/**
* 将xml文件读取到控制台
*/
public Document parse() throws DocumentException
{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("c:/maven.xml");
System.out.println(document.asXML());
return document;
}
/**
* 将字符串转化为Document
*
* @param str
* 输入的字符串
* @return 生成的document
* @throws DocumentException
*/
public Document parserStrtoDocument(String str) throws DocumentException
{
Document document = DocumentHelper.parseText(str);
System.out.println(document.asXML());
return document;
}
/**
* 取得xml的节点和属性的值
*
* @throws DocumentException
*/
public void getBaseInfofromDocument() throws DocumentException
{
String str = "<root><book type='science'><Name>Java</Name><price>100</price></book></root>";
// 生成一个Document
Document document = DocumentHelper.parseText(str);
System.out.println("xml文件样式" + document.asXML());
// 取得根结点
Element root = document.getRootElement();
// 取得book节点
Element book = root.element("book");
// 取得book节点的type属性的值
String type = book.attributeValue("type");
// 取得Name节点
Element name = book.element("Name");
// 取得书名
String bookname = name.getText();
// 取得书的价钱
int price = Integer.parseInt(book.element("price").getText());
// 输出书目信息
System.out.println("书名:" + bookname);
System.out.println("所属类别:" + type);
System.out.println("价格:" + price);
}
/**
* 利用迭代,xpath取得xml的节点及其属性值
*
* @throws DocumentException
*/
public void getComplexInfofromDocument() throws DocumentException
{
String str = "<root><book type='science'><Name>Java</Name><price>100</price></book>"
+ "<book type='science'><Name>Oracle</Name><price>120</price></book>"
+ "<book type='society'><Name>Society security</Name><price>130</price></book>"
+ "<author><name>chb</name></author></root>";
// 生成一个Document
Document document = DocumentHelper.parseText(str);
// 提取类型为"society"的书
// 此处需要添加支持xpath的jar包,详细见备注
Element society_book = (Element) document
.selectSingleNode("/root/book[@type='society']");
System.out.println(society_book.asXML());
// 提取价格节点的列表
System.out.println("-----------价格列表-------------");
List price = document.selectNodes("//price");
for (int i = 0; i < price.size(); i++)
{
Element elem_price = (Element) price.get(i);
System.out.println(elem_price.getText());
}
// 循环根结点下的所有节点,若当前节点为book,则输出这本书的详细信息
System.out.println("-------------书目详情------------");
System.out.println("书名/t/t类别/t/t价格");
Element root = document.getRootElement();
Iterator iterator = root.elementIterator();
while (iterator.hasNext())
{
Element element = (Element) iterator.next();
if (element.getName().equals("book"))
{
System.out.print(element.element("Name").getText() + "/t");
System.out.print(element.attributeValue("type") + "/t/t");
System.out.print(element.element("price").getText() + "/n");
}
}
// 查找作者姓名
Element author = (Element) document.selectSingleNode("//author");
System.out.println("---------" + author.element("name").getText()
+ "----------");
// 提取作者的所有书目名称
Iterator iterator_book = root.elementIterator("book");
while (iterator_book.hasNext())
{
Element book = (Element) iterator_book.next();
System.out.print(book.element("Name").getText() + "/t");
}
// 属性迭代
System.out.println("/n-------属性迭代--------");
String str1 = "<book type='science' name='Java' price='100'/>";
Document document1 = DocumentHelper.parseText(str1);
// 开始迭代
Iterator iterator_attribute = document1.getRootElement()
.attributeIterator();
while (iterator_attribute.hasNext())
{
// 提取当前属性
Attribute attribute = (Attribute) iterator_attribute.next();
System.out
.println(attribute.getName() + ":" + attribute.getValue());
}
}
public static void main(String[] args) throws Exception
{
Dom4jTest dt = new Dom4jTest();
dt.getComplexInfofromDocument();
}
}