JDOM 操作XML.docx

上传人:b****8 文档编号:11074901 上传时间:2023-02-24 格式:DOCX 页数:26 大小:22.92KB
下载 相关 举报
JDOM 操作XML.docx_第1页
第1页 / 共26页
JDOM 操作XML.docx_第2页
第2页 / 共26页
JDOM 操作XML.docx_第3页
第3页 / 共26页
JDOM 操作XML.docx_第4页
第4页 / 共26页
JDOM 操作XML.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

JDOM 操作XML.docx

《JDOM 操作XML.docx》由会员分享,可在线阅读,更多相关《JDOM 操作XML.docx(26页珍藏版)》请在冰豆网上搜索。

JDOM 操作XML.docx

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:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1