示例XML文档(holen.xml)
为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
holen.xml
|
<?xml version="1.0"
encoding="UTF-8"?>
<books>
<!--This is a test for dom4j, holen,
2004.9.11-->
<book show="yes">
<title>Dom4j
Tutorials</title>
</book>
<book show="yes">
<title>Lucene
Studing</title>
</book>
<book show="no">
<title>Lucene in
Action</title>
</book>
<owner>O'Reilly</owner>
</books>
|
这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。
3.
建立一个XML文档
|
public int createXMLFile(String
filename){
int returnValue = 0;
Document document = DocumentHelper.createDocument();
Element booksElement = document.addElement("books");
booksElement.addComment("This is a test for dom4j, holen,
2004.9.11");
Element bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","yes");
Element titleElement = bookElement.addElement("title");
titleElement.setText("Dom4j Tutorials");
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("Lucene in Action");
Element ownerElement = booksElement.addElement("owner");
ownerElement.setText("O'Reilly");
try{
XMLWriter writer = new
XMLWriter(new FileWriter(new
File(filename)));
writer.write(document);
writer.close();
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
|
说明:
Document document =
DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
Element booksElement =
document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l
addComment:添加注释
l
addAttribute:添加属性
l
addElement:添加子元素
最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。
生成后的holen.xml文件内容如下:
|
<?xml version="1.0"
encoding="UTF-8"?>
<books><!--This is a
test for dom4j, holen,
2004.9.11--><book
show="yes"><title>Dom4j
Tutorials</title></book><book
show="yes"><title>Lucene
Studing</title></book><book
show="no"><title>Lucene
in
Action</title></book><owner>O'Reilly</owner></books>
|
4.
修改XML文档
有三项修改任务,依次为:
l
如果book节点中show属性的内容为yes,则修改成no
l
把owner项内容改为Tshinghua,并添加date节点
l
若title内容为Dom4j Tutorials,则删除该节点
|
public int ModiXMLFile(String
filename,String newfilename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new
File(filename));
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");
}
}
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("2004-09-11");
dateElement.addAttribute("type","Gregorian calendar");
}
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{
XMLWriter writer = new
XMLWriter(new FileWriter(new
File(newfilename)));
writer.write(document);
writer.close();
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
|
说明:
List list =
document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。
通过setValue()、setText()修改节点内容。
通过remove()删除节点或属性。
5.
格式化输出和指定编码
默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
|
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();
format.setEncoding("GBK");
writer= new XMLWriter(new
FileWriter(new File(filename)),format);
writer.write(document);
writer.close();
returnValue =
1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}
|
说明:
OutputFormat format =
OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。
format.setEncoding("GBK");
指定编码为GBK。
XMLWriter writer = new XMLWriter(new
FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
=================================================================================================
如果我们格式化一个xml文件话,我们可能使用下面的方法:
try{
SAXReader saxReader = new SAXReader();
注释:先读入一个文件流
Document doc= saxReader.read(new FileInputStream(new File(filePath)));
注释:创建输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
注释:制定输出xml的编码类型
format.setEncoding("GBK");
注释:创建一个文件输出流
XMLWriter writer= new XMLWriter(new FileWriter(new File(filename)),format);
注释:将格式化后的xml串写入到文件
writer.write(doc);
writer.close();
}catch(Exception ex){
……
}
经过的步骤是:
读取xml文件,然后再格式化输出。
那么,如果我们得到了一个XML的串,当然,是在内存中的,我们有如何返回一个格式化后的串呢?
其实也很简单,就是先把xml的串读到一个流中,然后解析,在格式化输出就可以了。下面就是我的实现;
注释:str是你的参数,也就是在内存中的没有格式化过的xml串
public static String format(String str) throws UnsupportedEncodingException,
IOException, DocumentException {
//System.out.println(" str : " + str);
SAXReader reader=new SAXReader();
//System.out.println(reader);
注释:创建一个串的字符输入流
StringReader in=new StringReader(str);
Document doc=reader.read(in);
// System.out.println(doc.getRootElement());
注释:创建输出格式
OutputFormat formater=OutputFormat.createPrettyPrint();
注释:设置xml的输出编码
formater.setEncoding("utf-8");
注释:创建输出(目标)
StringWriter out=new StringWriter();
注释:创建输出流
XMLWriter writer=new XMLWriter(out,formater);
注释:输出格式化的串到目标中,执行后。格式化后的串保存在out中。
writer.write(doc);
//writer.close();
System.out.println(out.toString());
注释:返回我们格式化后的结果
return out.toString();
}