java操作xml有哪些解析技术,java dom解析xml
可扩展置标语言现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用爪哇解析可扩展置标语言的四种方法。
可扩展置标语言现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于可扩展置标语言本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(文档对象模型)、DTD(文档类型定义)、SAX(XML的简单API)、XSD(Xml模式定义)、XSLT(可扩展样式表语言转换)、具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。
可扩展置标语言在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫萨克斯,另一种叫多姆。萨克斯管是基于事件流的解析,DOM是基于可扩展置标语言文档树结构的解析。假设我们可扩展置标语言的内容和结构如下:
?可扩展标记语言版本=1.0 编码=UTF八号?
雇员
雇员
名称ddviplinux /name
性男/性
30岁/年龄
/员工
/员工
本文使用爪哇岛语言来实现数字正射影像图与萨克斯管的可扩展置标语言文档生成与解析。
首先定义一个操作可扩展置标语言文档的接口文件它定义了可扩展置标语言文档的建立与解析的接口。
包com。阿里软件。工资照付。框架。豆;
/**
*
* @作者洪亮。丁尔
* 定义可扩展置标语言文档建立与解析的接口
*/
公共接口XmlDocument {
/**
* 建立可扩展置标语言文档
* @param文件名文件全路径名称
*/
public void createXml(字符串文件名);
/**
* 解析可扩展置标语言文档
* @param文件名文件全路径名称
*/
公共void parserXml(字符串文件名);
}
1.数字正射影像图生成和解析可扩展置标语言文档
为可扩展置标语言文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用数字正射影像图接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
包com。阿里软件。工资照付。框架。豆;
导入Java。io。文件输入流;
导入Java。io。filenotfoundexception
导入Java。io。文件输出流;
导入Java。io。io异常;
导入Java。io。inputstream
导入Java。io。版画家;
导入javax。XML。解析器。文档生成器;
导入javax。XML。解析器。documentbuilderfactory
导入javax。XML。解析器。parserconfigurationexception
导入javax。XML。转变。输出键;
导入javax。XML。转变。变压器;
导入javax。XML。转变。transformerconfigurationexception;
导入javax。XML。转变。变压器异常;
导入javax。XML。转变。变压器厂;
导入javax。XML。转变。多姆。DOM源;
导入javax。XML。转变。溪流。流结果;
导入org。W3C。多姆。文档;
导入org。W3C。多姆。元素;
导入org。W3C。多姆。节点;
导入org。W3C。多姆。nodelist
导入org。XML。萨克斯。sax异常;
/**
*
* @作者洪亮。丁尔
* DOM生成与解析可扩展置标语言文档
*/
公共类东德莫实现XmlDocument {
私人文档文档;
私有字符串文件名;
public void init() {
尝试{
DocumentBuilderFactory factory=DocumentBuilderFactory。新实例();
文档生成器生成器=工厂。newdocumentbuilder();
这个。文档=构建器。新建文档();
} catch(ParserConfigurationException e){
系统。出去。println(e . getmessage());
}
}
public void createXml(字符串文件名){
元素根=this。文档。createelement(“雇员”);
this.document.appendChild(根);
元素员工=this。文档。createelement(“雇员”);
元素名=this。文档。createelement( name ).
姓名。追加子对象(this。文档。创建文本节点(丁宏亮));
employee.appendChild(姓名);
元素性=这个。文档。createelement(“sex”);
做爱。appendchild(这个。文档。创建文本节点( m );
employee.appendChild(性别);
元素年龄=这个。文档。createelement(“age”);
年龄。追加子对象(this。文档。创建文本节点(“30”);
employee.appendChild(年龄);
root.appendChild(员工);
变压器工厂。新实例();
尝试{
变压器变压器=TF。新变压器();
DOMSource source=新DOMSource(文档);
变形金刚。setoutputproperty(输出键.编码,‘GB 2312’);
变形金刚。setoutputproperty(输出键.缩进,是);
PrintWriter pw=new PrintWriter(新文件输出流(文件名));
流结果结果=新的流结果(pw);
变压器.变压器(源,结果);
System.out.println(生成可扩展置标语言文件成功!);
} catch(TransformerConfigurationException e){
系统。出去。println(e . getmessage());
} catch(IllegalArgumentException e){
系统。出去。println(e . getmessage());
} catch(找不到文件异常e){
系统。出去。println(e . getmessage());
} catch (TransformerException e) {
系统。出去。println(e . getmessage());
}
}
公共void parserXml(字符串文件名){
尝试{
DBF=DocumentBuilderFactory。新实例();
文件生成器db=DBF。newdocumentbuilder();
Document document=db.parse(文件名);
NodeList雇员=文档。获取子节点();
for(int I=0;一、员工。getlength();i ) {
节点员工=员工。项目(一);
节点列表员工信息=员工。获取子节点();
for(int j=0;j员工信息。getlength();j ) {
节点node=员工信息。项目(j);
NodeList雇员元=节点。获取子节点();
for(int k=0;k员工元。getlength();k ) {
系统。出去。println(员工元。第(k)项.getNodeName()
: employeeMeta.item(k).gettext content());
}
}
}
System.out.println(解析完毕);
} catch(找不到文件异常e){
系统。出去。println(e . getmessage());
} catch(ParserConfigurationException e){
系统。出去。println(e . getmessage());
} catch (SAXException e) {
系统。出去。println(e . getmessage());
} catch (IOException e) {
系统。出去。println(e . getmessage());
}
}
}
2.萨克斯管生成和解析可扩展置标语言文档
为解决数字正射影像图的问题,出现了萨克斯管。萨克斯,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;萨克斯管解析器代码比数字正射影像图解析器代码小,适于小程序,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:小程序;只需可扩展置标语言文档的少量内容,很少回头访问;机器内存少;
爪哇代码
包com。阿里软件。工资照付。框架。豆;
导入Java。io。文件输入流;
导入Java。io。filenotfoundexception
导入Java。io。io异常;
导入Java。io。inputstream
导入javax。XML。解析器。分析器配置异常;
导入javax。XML。解析器。sax解析器;
导入javax。XML。解析器。saxparserfactory
导入org。XML。萨克斯。属性;
导入org。XML。萨克斯。sax异常;
导入org。XML。萨克斯。帮手。默认处理程序;
/**
*
* @作者洪亮。丁尔
* SAX文档解析
*/
公共类萨克斯演示实现XmlDocument {
public void createXml(字符串文件名){
系统。出去。println(文件名 );
}
公共void parserXml(字符串文件名){
SAXParserFactory sax fac=SAXParserFactory。新实例();
尝试{
sax解析器sax解析器=sax fac。newsaxparser();
输入流为=新文件输入流(文件名);
saxparser.parse(is,new mysax handler());
} catch(ParserConfigurationException e){
e。printstacktrace();
} catch (SAXException e) {
e。printstacktrace();
} catch(找不到文件异常e){
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}
}
}
类MySAXHandler扩展了默认处理程序{
布尔hasAttribute=false
属性属性=空
public void startDocument()抛出sax异常{
System.out.println(文档开始打印了);
}
公共void endDocument()抛出sax异常{
System.out.println(文档打印结束了);
}
公共void startElement(字符串uri,字符串localName,字符串qName,
属性属性)抛出sax异常{
如果(qname。等于(员工){
返回;
}
如果(qname。等于(员工){
系统。出去。println(qName);
}
if (attributes.getLength() 0) {
这个. attributes=属性
this.hasAttribute=true
}
}
公共void endElement(字符串uri,字符串localName,字符串qName)
引发sax异常{
if (hasAttribute (attributes!=null)) {
for(int I=0;一.属性。getlength();i ) {
系统。出去。println(属性。getqname(0)
属性。getvalue(0));
}
}
}
公共空字符(char[] ch,int start,int length)
引发sax异常{
系统。出去。println(新字符串(ch,start,length));
}
}
包com。阿里软件。工资照付。框架。豆;
导入Java。io。文件输入流;
导入Java。io。filenotfoundexception
导入Java。io。io异常;
导入Java。io。inputstream
导入javax。XML。解析器。分析器配置异常;
导入javax。XML。解析器。sax解析器;
导入javax。XML。解析器。saxparserfactory
导入org。XML。萨克斯。属性;
导入org。XML。萨克斯。sax异常;
导入org。XML。萨克斯。帮手。默认处理程序;
/**
*
* @作者洪亮。丁尔
* SAX文档解析
*/
公共类萨克斯演示实现XmlDocument {
public void createXml(字符串文件名){
系统。出去。println(文件名 );
}
公共void parserXml(字符串文件名){
SAXParserFactory sax fac=SAXParserFactory。新实例();
尝试{
sax解析器sax解析器=sax fac。newsaxparser();
输入流为=新文件输入流(文件名);
saxparser.parse(is,new mysax handler());
} catch(ParserConfigurationException e){
e。printstacktrace();
} catch (SAXException e) {
e。printstacktrace();
} catch(找不到文件异常e){
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}
}
}
类MySAXHandler扩展了默认处理程序{
布尔hasAttribute=false
属性属性=空
public void startDocument()抛出sax异常{
System.out.println(文档开始打印了);
}
公共void endDocument()抛出sax异常{
System.out.println(文档打印结束了);
}
公共void startElement(字符串uri,字符串localName,字符串qName,
属性属性)抛出sax异常{
如果(qname。等于(员工){
返回;
}
如果(qname。等于(员工){
系统。出去。println(qName);
}
if (attributes.getLength() 0) {
这个. attributes=属性
this.hasAttribute=true
}
}
公共void endElement(字符串uri,字符串localName,字符串qName)
引发sax异常{
if (hasAttribute (attributes!=null)) {
for(int I=0;一.属性。getlength();i ) {
系统。出去。println(属性。getqname(0)
属性。getvalue(0));
}
}
}
公共空字符(char[] ch,int start,int length)
引发sax异常{
系统。出去。println(新字符串(ch,start,length));
}
}
3.DOM4J生成和解析可扩展置标语言文档
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的爪哇软件都在使用DOM4J来读写XML,特别值得一提的是连太阳的JAXM也在用DOM4J。
爪哇代码
包com。阿里软件。工资照付。框架。豆;
导入Java。io。文件;
导入Java。io。filewriter
导入Java。io。io异常;
导入Java。io。作家;
导入Java。util。迭代器;
导入org。dom4j。文档;
导入org。dom4j。文档异常;
导入org。dom4j。文档助手;
导入org。dom4j。元素;
导入org。dom4j。io。sax阅读器;
导入org。dom4j。io。XML编写器;
/**
*
* @作者洪亮。丁尔
* Dom4j生成可扩展置标语言文档与解析可扩展置标语言文档
*/
公共类Dom4jDemo实现XmlDocument {
public void createXml(字符串文件名){
文档文档=文档助手。创建文档();
元素员工=文档。添加元素(“雇员”);
元素雇员=雇员。添加元素(“雇员”);
元素名称=员工。添加元素( name );
姓名。settext( DD VIP );
元素性别=员工。添加元素(“sex”);
做爱。settext( m );
要素年龄=员工。添加元素(“年龄”);
年龄。settext( 29 );
尝试{
编写器文件编写器=新文件写入器(文件名);
XMLWriter XMLWriter=new XMLWriter(文件编写器);
xmlWriter.write(文档);
XML编写器。close();
} catch (IOException e) {
系统。出去。println(e . getmessage());
}
}
公共void parserXml(字符串文件名){
文件输入Xml=新文件(文件名);
SAXReader SAXReader=new SAXReader();
尝试{
文档文档=sax阅读器。读取(输入XML);
元素员工=文档。getrootelement();
for(迭代器I=雇员。元素迭代器();I .有next();){
元素employee=(Element)I . next();
for(迭代器j=雇员。元素迭代器();j .有next();){
元素node=(Element)j . next();
系统。出去。println(节点。getname()“:”节点。gettext());
}
}
} catch (DocumentException e) {
系统。出去。println(e . getmessage());
}
系统。出去。println( dom4j解析器XML );
}
}
4.JDOM生成和解析可扩展置标语言
为减少DOM、SAX的编码量,出现了JDOM优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用萨克斯(最常用)、DOM、Xanan文档。
包com。阿里软件。工资照付。框架。豆;
导入Java。io。filenotfoundexception
导入Java。io。文件输出流;
导入Java。io。io异常;
导入Java。util。列表;
导入org。JDOM。文档;
导入org。JDOM。元素;
导入org。JDOM。jdo异常;
导入org。JDOM。输入。sax builder
导入组织。JDOM。输出。xmloutputter
/**
*
* @作者洪亮。丁尔
* JDOM生成与解析可扩展置标语言文档
*
*/
公共类JDomDemo实现XmlDocument {
public void createXml(字符串文件名){
文档文档;
元素根;
根=新元素(“员工”);
文档=新文档(根);
元素员工=新元素(‘员工’);
root.addContent(员工);
元素名称=新元素(名称);
姓名。settext( DD VIP );
员工.添加内容(姓名);
元素性别=新元素(性别);
做爱。settext( m );
员工.添加内容(性别);
元素年龄=新元素(年龄);
年龄。settext( 23 );
员工.添加内容(年龄);
XMLOutputter XMLOut=new XMLOutputter();
尝试{
XMLOut.output(文档,新文件输出流(文件名));
} catch(找不到文件异常e){
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}
}
公共void parserXml(字符串文件名){
sax builder builder=new sax builder(false);
尝试{
文档document=builder.build(文件名);
元素员工=文档。getrootelement();
列出员工列表=员工。获取子代(“员工”);
for(int I=0;一、员工名单。size();i ){
元素员工=(元素)员工列表。get(I);
列出员工信息=员工。获取子对象();
for(int j=0;j员工信息。size();j ){
系统。出去。println((元素)员工信息。get(j)).getName():((Element)雇员信息。get(j)).getValue());
}
}
} catch(jdo异常e){
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}
}
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。