JDOM 操作XML.docx
《JDOM 操作XML.docx》由会员分享,可在线阅读,更多相关《JDOM 操作XML.docx(26页珍藏版)》请在冰豆网上搜索。
JDOM操作XML
JDOM操作XML
可扩展标记语言——eXtensibleMarkupLanguage
用户可以自己定义语言标记,只要有开始和闭合标签即可。
xsl装饰、修饰xml的显示结果。
dtd约束xml文件中的标记。
ØXML的优点:
1、xml可以让数据和标记分离。
2、异质信息互通
3、机器语言
4、用交流语言替代html装饰语言
5、简单易用
6、可以自定义、可扩展
ØXML和HTML比较
比较内容
HTML
XML
可扩展性
不具有扩展性、标记固定
是元标记语言,可以定义新标记,用户可以自定义标记
侧重点
侧重于信息的表现形式为什么格式被关注
侧重于结构化的描述信息,数据是什么为XML所关注
语法
不严格(嵌套、配对)
严格嵌套、配对,并按照DTD要求输出
可读性、可维护性
难于阅读和维护
结构清晰,便于阅读维护
数据本身、显示
数据和显示合为一处
数据与显示分离
重用性
低
可重用性高
ØJDOM操作XML
JDOM可以很方便的操作XML文档,完成XML内容的创建、修改,已经遍历Document文档中的XML元素,完成查询等。
下面我们就用JDOM完成这些功能。
#准备
首先我们要准备jdom相关的jar包
jdom-jar下载地址:
http:
//www.jdom.org/dist/binary/
jaxen在jdom的zip压缩包中可以找到。
Junit是测试用的,可以不添加。
但需要用main方法测试。
Junit-jar
其次,是准备测试工作。
部分测试代码:
packagecom.hoo.test;
importjava.io.File;
importjava.io.IOException;
importjava.util.List;
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importjavax.xml.parsers.ParserConfigurationException;
importorg.jdom.Attribute;
importorg.jdom.Comment;
importorg.jdom.Document;
importorg.jdom.Element;
importorg.jdom.JDOMException;
importorg.jdom.Namespace;
importorg.jdom.Text;
importorg.jdom.input.SAXBuilder;
importorg.jdom.output.XMLOutputter;
importorg.jdom.xpath.XPath;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
/**
*function:
JDOM操作XML
*@authorhoojo
*@createDate2011-8-4下午12:
34:
09
*@fileDocumentTest.java
*@packagecom.hoo.test
*@projectJDOMTest
*@blog
*@emailhoojo_@
*@version1.0
*/
publicclassDocumentTest{
privateXMLOutputterout=null;
@Before
publicvoidinit(){
//输出文件信息
out=newXMLOutputter();
}
@After
publicvoiddestory(){
if(out!
=null){
out=null;
}
System.gc();
}
/**
*function:
输出Document文档信息
*@authorhoojo
*@createDate2011-8-5下午12:
10:
27
*@paramdoc
*/
privatevoidprint(Documentdoc){
//设置XML文件编码格式
//out.setFormat(Format.getCompactFormat().setEncoding("gb2132"));
System.out.println(out.outputString(doc));
}
privatevoidfail(Objecto){
if(o!
=null){
System.out.println(o);
}
}
}
#创建Document
/**
*创建xml元素
*/
@Test
publicvoidcreateDoc(){
Documentdoc=null;
//method1、创建一个Doc文档,添加一个元素root
doc=newDocument(newElement("root"));
print(doc);
//method2、创建一个Doc文档,添加一个元素root,设置root元素的节点文本
doc=newDocument(newElement("root").setText("thisisarootel"));
print(doc);
//method3、创建一个Doc文档,添加一个元素root,设置root元素的节点文本且添加一个属性id,值为110
Elementroot=newElement("root");
root.setText("thisisarootel");
root.setAttribute("id","110");
doc.setRootElement(root);
fail("method3:
\n"+out.outputString(doc));
//method4、创建一个Doc文档,添加一个元素root,设置root元素的节点文本
doc=newDocument();
doc.addContent(newElement("root").setText("thisisarootel"));
fail("method4:
\n"+out.outputString(doc));
fail(doc.toString());
}
*newDocument可以创建一个doc文档
当给Document传递一个Element参数时,这个Element就是根元素;
当调用Document的setRootElement方法时,可以设置当前Doc的根元素;
当调用doc的addContent的时候,添加的元素将会是根元素;
doc=newDocument(newElement("root").setText("thisisarootel"));
上面就创建了一个doc,根元素是root,root节点的内容是thisisarootel;
注意setText方法返回的对象是当前Element,类似是StringBuffer的append方法;
*newElement()可以创建一个元素
如果传递参数那么这个参数将会是元素节点的名称;
Element的setText方法可以设置元素的文本值;
Elementroot=newElement("root");
root.setText("thisisarootel");
创建一个节点名称为root的元素,文本是thisisarootel
*setAttribute()可以设置某个具体节点的属性值
root.setAttribute("id","110");
给root节点添加一个id,值为110
*addContent添加注释
root.addContent(newComment("注释"));
在root元素下添加一个注释;
addContent是向元素中添加内容,而setContent是设置内容;
*setText设置元素文本内容
root.setText("thisisarootel");
同样
root.setContent(newText("thisistext"))
同样
root.addContent("thisistext");
下面用上面的这些方法,创建一篇XML文档。
文档内容如下:
/**
创建一遍xml文档
xmlversion="1.0"encoding="UTF-8"?
>
--Descriptionofacar-->
Toyota
Celica
1997
green
1ABC234
*/
@Test
publicvoidcreateXMLDoc(){
//创建一个car的元素
ElementcarEl=newElement("car");
//创建vin属性,并设置值
carEl.setAttribute("vin","123fhg5869705iop90");
//创建注释
carEl.addContent(newComment("Descriptionofacar"));
//创建一个make元素,设置文本内容
carEl.addContent(newElement("make").setText("Toyota"));
//创建一个model元素,添加一个文本元素
carEl.addContent(newElement("model").setContent(newText("Celica")));
//创建一个year元素,添加文本内容
carEl.addContent(newElement("year").addContent("1997"));
//创建一个color元素,文本内容是green
carEl.addContent(newElement("color").setText("green"));
//创建一个license的元素
ElementlicenseEl=newElement("license");
//为license元素添加文本内容
licenseEl.addContent("1ABC234");
//创建一个state的属性,值为CA
licenseEl.setAttribute("state","CA");
//将licenseEl添加到根元素中
carEl.addContent(licenseEl);
//将car元素设置为根元素
Documentdoc=newDocument(carEl);
print(doc);
/*out=newXMLOutputter();
try{
out.output(doc,System.out);
}catch(IOExceptione){
e.printStackTrace();
}*/
}
方法运行后,所创建的文档和上面注释文档内容相同
#读取XML文件的内容
disk.xml文件内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
8G
200
1580
10G
500
3000
11G
50
Javabook
Spring.txt
strtus.doc
500
读取disk文件的内容,代码如下:
/**
*function:
读取xml文件中的元素
*@authorhoojo
*@createDate2011-8-4下午04:
54:
17
*/
@Test
@SuppressWarnings("unchecked")
publicvoidreadXMLContent(){
SAXBuilderbuilder=newSAXBuilder();
try{
Documentdoc=builder.build(newFile("file/disk.xml"));
ElementrootEl=doc.getRootElement();
//获得所有子元素
Listlist=rootEl.getChildren();
//Listlist=rootEl.getChildren("disk");
for(Elementel:
list){
//获取name属性值
Stringname=el.getAttributeValue("name");
//获取子元素capacity文本值
Stringcapacity=el.getChildText("capacity");
//获取子元素directories文本值
Stringdirectories=el.getChildText("directories");
Stringfiles=el.getChildText("files");
System.out.println("磁盘信息:
");
System.out.println("分区盘符:
"+name);
System.out.println("分区容量:
"+capacity);
System.out.println("目录数:
"+directories);
System.out.println("文件数:
"+files);
System.out.println("-----------------------------------");
}
}catch(JDOMExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
*getChildren方法可以获取所有子元素
*getChildren(elName)可以获取所有名称为elName的子节点
*getAttributeValue可以获取指定属性的值
*getChildText可以获取子节点的文本值
#递归显示文档信息
/**
*递归返回指定格式的“--”
*/
privateStringformat(inti){
Stringtemp="";
if(i>0){
temp+="--";
i--;
temp+=format(i);
}
returntemp;
}
/**
*function:
显示当前节点所有Element的属性信息
*@authorhoojo
*@createDate2011-8-4下午06:
10:
53
*@paramel
*@return
*/
@SuppressWarnings("unchecked")
privateStringgetAttrInfo(Elementel){
Listattrs=el.getAttributes();
returngetAttrInfo(attrs);
}
/**
*function:
显示属性信息
*@authorhoojo
*@createDate2011-8-9下午03:
52:
59
*@paramattrs
*@return
*/
privateStringgetAttrInfo(Listattrs){
StringBuilderinfo=newStringBuilder();
for(Attributeattr:
attrs){
info.append(attr.getName()).append("=").append(attr.getValue()).append(",");
}
if(info.length()>0){
return"["+info.substring(0,info.length()-2)+"]";
}
return"";
}
/**
*function:
递归显示文档节点元素信息
*@authorhoojo
*@createDate2011-8-4下午05:
56:
34
*@parami
*@paramlist
*/
@SuppressWarnings("unchecked")
privatevoidprint(inti,Listlist){
i++;
for(Elementel:
list){
Listchilds=el.getChildren();
if(childs.size()>0){
fail(format(i)+el.getName()+""+getAttrInfo(el));
print(i,childs);
}else{
fail(format(i)+el.getName()+":
"+el.getText()+""+getAttrInfo(el));
}
}
}
调用print(0,root.getChildren());方法就可以看到一篇格式化后输出的文档内容
#############显示文档信息###############
--HD
----disk[name=C]
------capacity:
8G
------directories:
200
------files:
1580
----disk[name=D]
------capacity:
10G
------directories:
500
------files:
3000
----disk2[name=E]
------capacity:
11G
------directories:
50
------files[size=200,modifyDate=2011-08-3]
--------file:
Javabook
--------file:
Spring.txt
--------file:
strtus.doc
----files:
500[size=220]
#XPath查询遍历XML文档
/**
*function:
用xpath遍历xml信息
*@authorhoojo
*@createDate2011-8-4下午04:
56:
52
*xpath参考:
*
*nodeName选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的
.选取当前节点
..选取当前节点的父节点
@选取属性
*匹配任何元素节点
@*匹配任何属性节点
node()配任何类型的节点
ancestor选取当前节点的所有先辈(父、祖父等)
ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素。
descendant选取当前节点的所有后代元素(子、孙等)。
descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following选取文档中当前节点的结束标签之后的所有节点。
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点。
preceding选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling选取当前节点之前的所有同级节点。
self选取当前节点。
child:
:
book选取所有属于当前节点的子元素的book节点
attribute:
:
languane选取当前节点的languange属性
child:
:
*选取当前节点的所有子元素
attribute:
:
*选取当前节点的所有属性
child:
:
text()选取当前节点的所有文本子节点
child: