您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

XML解析基础

2026/3/26 0:19:32发布18次查看
java web开发实战经典
在项目开发中,html的主要功能是进行数据展示,而要进行数据存储结构的规范化就需要使用xml。xml有自己的语法,而且所有的标记元素都可以由用户任意定义。
1、认识xmlxml(extended markup language,可扩展的标记性语言)提供了一套跨平台、跨网络、跨程序的语言的数据描述方式,使用xml可以方便地实现数据交换、系统配置、内容管理等常见功能。
xml与html类似,都属于标记性语言。最大的不同时html中的元素都是固定的,且以显示为主,而xml语言中的标记都是由用户自定义的,主要以数据保存为主。
xml和html的比较
实际上所有的xml文件都由前导区和数据区两部分组成。
前导区:规定出xml页面的一些属性,有以下3个属性:
version:表示使用的xml版本,现在是1.0。
encoding:页面中使用的文字编码,如果有中文,则一定要指定编码。
standalone:此xml文件是否是独立运行,如果需要进行显示可以使用css或xsl控制。
属性出现的顺序是固定的,version、encoding、standalone,一旦顺序不对,xml将出现错误。
 <?xml version="1.0" encoding="gb2312" standalone="no"?>
数据区:所有的数据区必须有一个根元素,一个根元素下可以存放多个子元素,但是要求每一个元素必须完结,每一个标记都是区分大小写的。
xml语言中提供了cdata标记来标识文件数据,当xml解析器处理到cdata标记时,它不会解析该段数据中的任何符号或标记,只是将原数据原封不动的传递给应用程序。
cdata语法格式:
<![cdata[] 不解析内容 ]>
2、xml解析在xml文件中由于更多的是描述信息的内容,所以在得到一个xml文档后用该利用程序按照其中元素的定义名称取出对应的内容,这样的操作就称为xml解析。
在xml解析中w3c定义了sax和dom两种解析方式,这两种解析方式的程序操作如下:
xml解析操作
可以看出,应用程序不是直接对xml文档进行操作的,而是首先由xml分析器对xml文档进行分析,然后应用程序通过xml分析器所提供的dom接口或sax接口对分析结构进行操作,从而间接地实现了对xml文档的访问。
2.1、dom解析操作
在应用程序中,基于dom  (document object model,文档对象模型)的xml分析器将一个xml文档转换成一个对象模型的集合(通常称为dom树),应用程勋正是通过对这个对象模型的操作,来实现对xml文档数据的操作。通过dom接口,应用程序可以在任何时候访问xml文档中的任何一部分数据,因此,这种这种利用dom接口的机制也被称作随机访问机制。
由于dom分析器把整个xml文档转化成dom树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高,而且对于结构复杂的树的遍历也是一项耗时的操作。
dom操作会在内存中将所有的xml文件变为dom树。
在dom解析中有以下4个核心的操作接口:
document:此接口代表了整个xml文档,表示整个dom树的根,提供了对文档中的数据进行访问和操作的入口,通过document节点可以访问xml文件中所有的元素内容。
document接口的常用方法
node:dom操作的核心接口中有很大一部分是从node接口继承过来的。例如document、element、attri等接口。在dom树中,每一个node接口代表了dom树中的一个节点。
node接口的常用方法
nodelist:此接口表示一个节点的集合,一般用于表示有顺序关系的一组节点。例如,一个节点的子节点,当文档改变时会直接 影响到nodelist集合。
nodelist接口的常用方法
namenodemap:此接口表示一组节点和其唯一名称对应的一一对应关系,主要用于属性节点的表示。
出以上4个核心接口外,如果一个程序需要进行dom解析读操作,则需要按如下步骤进行:
(1)建立documentbuilderfactory:documentbuilderfactory factory = documentbuilderfactory.newinstance();
(2)建立documentbuilder:documentbuilder builder = factory.newdocumentbuilder();
(3)建立document:document doc= builder.parse(要读取的文件路径);
(4)建立nodelist:nodelist nl = doc.getelementsbytagname(读取节点);
(5)进行xml信息读取。
// xml_demo.xml <?xml version="1.0" encoding="gbk"?> <addresslist>     <linkman>         <name>小明</name>         <email>asaasa@163.com</email>     </linkman>     <linkman>         <name>小张</name>         <email>xiaoli@163.com</email>     </linkman> </addresslist>
dom完成xml的读取。
package com.demo; import java.io.ioexception; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.parserconfigurationexception; import org.w3c.dom.document; import org.w3c.dom.element; import org.w3c.dom.nodelist; import org.xml.sax.saxexception; public class xmldomdemo {     public static void main(string[] args) {         // (1)建立documentbuilderfactory,以用于取得documentbuilder         documentbuilderfactory factory = documentbuilderfactory.newinstance();         // (2)通过documentbuilderfactory,取得documentbuilder         documentbuilder builder = null;         try {             builder = factory.newdocumentbuilder();         } catch (parserconfigurationexception e) {             e.printstacktrace();         }         // (3)定义document接口对象,通过documentbuilder类进行dom树是转换操作         document doc = null;         try {             // 读取指定路径的xml文件,读取到内存中             doc = builder.parse(xml_demo.xml);         } catch (saxexception e) {             e.printstacktrace();         } catch (ioexception e) {             e.printstacktrace();         }         // (4)查找linkman节点         nodelist nl = doc.getelementsbytagname(linkman);         // (5)输出nodelist中第一个子节点中文本节点的内容         for (int i = 0; i < nl.getlength(); i++) { // 取出每一个元素 element element = (element) nl.item(i); system.out.println("姓名:" + element.getelementsbytagname("name").item(0).getfirstchild().getnodevalue()); system.out.println("邮箱:" + element.getelementsbytagname("email").item(0).getfirstchild().getnodevalue()); } } }
dom完成xml的文件输出。
此时就需要使用dom操作中提供的各个接口(如element接口)并手工设置各个节点的关系,同时在创建document对象时就必须使用newdocument()方法建立一个新的dom树。
如果现在需要将xml文件保存在硬盘上,则需要使用transformerfactory、transformer、domsource、streamresult 4个类完成。
transformerfactory类:取得一个transformer类的实例对象。
domsource类:接收document对象。
streamresult 类:指定要使用的输出流对象(可以向文件输出,也可以向指定的输出流输出)。
transformer类:通过该类完成内容的输出。
streamresult类的构造方法
package com.demo; import java.io.file; import javax.xml.parsers.documentbuilder; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.parserconfigurationexception; import javax.xml.transform.outputkeys; import javax.xml.transform.transformer; import javax.xml.transform.transformerconfigurationexception; import javax.xml.transform.transformerexception; import javax.xml.transform.transformerfactory; import javax.xml.transform.dom.domsource; import javax.xml.transform.stream.streamresult; import org.w3c.dom.document; import org.w3c.dom.element; public class xmldemowrite { public static void main(string[] args) { // (1)建立documentbuilderfactory,以用于取得documentbuilder documentbuilderfactory factory = documentbuilderfactory.newinstance(); // (2)通过documentbuilderfactory,取得documentbuilder documentbuilder builder = null; try { builder = factory.newdocumentbuilder(); } catch (parserconfigurationexception e) { e.printstacktrace(); } // (3)定义document接口对象,通过documentbuilder类进行dom树是转换操作 document doc = null; // 创建一个新的文档 doc = builder.newdocument(); // (4)建立各个操作节点 element addresslist = doc.createelement("addresslist"); element linkman = doc.createelement("linkman"); element name = doc.createelement("name"); element email = doc.createelement("email"); // (5)设置节点的文本内容,即为每一个节点添加文本节点 name.appendchild(doc.createtextnode("小明")); email.appendchild(doc.createtextnode("xiaoming@163.com")); // (6)设置节点关系 linkman.appendchild(name); linkman.appendchild(email); addresslist.appendchild(linkman); doc.appendchild(addresslist); // (7)输出文档到文件中 transformerfactory tf = transformerfactory.newinstance(); transformer t = null; try { t = tf.newtransformer(); } catch (transformerconfigurationexception e) { e.printstacktrace(); } // 设置编码 t.setoutputproperty(outputkeys.encoding, "gbk"); // 输出文档 domsource source = new domsource(doc); // 指定输出位置 streamresult result = new streamresult(new file("xml_wirte.xml")); try { // 输出 t.transform(source, result); system.out.println("yes"); } catch (transformerexception e) { e.printstacktrace(); } } }
生成文档:
//xml_write.xml <?xml version="1.0" encoding="gbk" standalone="no"?> <addresslist>     <linkman>         <name>小明</name>         <email>xiaoming@163.com</email>     </linkman> </addresslist>
2.2、sax解析操作
sax(simple apis for xml,操作xml的简单接口)与dom操作不同的是,sax采用的是一种顺序的模式进行访问,是一种快速读取xml数据的方式。
当使用sax 解析器进行操作时会触发一系列的事件。
sax主要事件
当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,并由这些操作方法做出相应的操作,直到整个文档扫描结束。
如果在开发中想要使用sax解析,则首先应该编写一个sax解析器,再直接定义一个类,并使该类继承自defaulthandler类,同时覆写上述的表中的方法即可。
package com.sax.demo; import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.helpers.defaulthandler; public class xmlsax extends defaulthandler {     @override     public void startdocument() throws saxexception {         system.out.println(<?xml version=\"1.0\" encoding=\"gbk\"?>);     }     @override     public void enddocument() throws saxexception {         system.out.println(\n 文档读取结束。。。);     }     @override     public void startelement(string url, string localname, string name,             attributes attributes) throws saxexception {         system.out.print(<"); system.out.print(name); if (attributes != null) { for (int x = 0; x < attributes.getlength(); x++) { system.out.print("" + attributes.getqname(x) + "=\"" + attributes.getvalue(x) + "\""); } } system.out.print(">);     }     @override     public void characters(char[] ch, int start, int length) throws saxexception {         system.out.print(new string(ch, start, length));     }     @override     public void endelement(string url, string localname, string name)             throws saxexception {         system.out.print(</"); system.out.print(name); system.out.print(">);     } }
建荔湾sax解析器后,还需要建立saxparserfactory和saxparser对象,之后通过saxpaeser的parse()方法指定要解析的xml文件和指定的sax解析器。
建立要读取的文件:sax_demo.xml
<?xml version="1.0" encoding="gbk"?> <addresslist>     <linkman id="xm">         <name>小明</name>         <email>xiaoming@163.com</email>     </linkman>     <linkman id="xl">         <name>小李</name>         <email>xiaoli@163.com</email>     </linkman> </addresslist>
使用sax解析器
package com.sax.demo; import javax.xml.parsers.saxparser; import javax.xml.parsers.saxparserfactory; public class saxtest {     public static void main(string[] args) throws exception {         //(1)建立sax解析工厂         saxparserfactory factory = saxparserfactory.newinstance();         //(2)构造解析器         saxparser parser = factory.newsaxparser();         //(3)解析xml使用handler         parser.parse(sax_demo.xml, new xmlsax());     } }
通过上面的程序可以发现,使用sax解析比使用dom解析更加容易。
dom解析与sax解析的区别
有两者的特点可以发现两者的区别:
dom解析适合于对文件进行修改和随机存取的操作,但是不适合于大型文件的操作。
sax采用部分读取的方式,所以可以处理大型文件,而且只需要从文件中读取特定内容。sax解析可以由用户自己建立自己的对象模型。
2.3、xml解析的好帮手:jdom
jdom是使用java编写的,用于读、写、操作xml的一套组件。
jdom = dom 修改文件的有点 + sax读取快速的优点
jdom的主要操作类
使用jdom生成xml文件
package com.jdom.demo; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import org.jdom.attribute; import org.jdom.document; import org.jdom.element; import org.jdom.output.xmloutputter; public class writexml {     public static void main(string[] args) {         // 定义节点         element addresslist = new element(addresslist);         element linkman = new element(linkman);         element name = new element(name);         element email = new element(email);         // 定义属性         attribute id = new attribute(id, xm);         // 声明一个document对象         document doc = new document(addresslist);         // 设置元素的内容         name.settext(小明);         email.settext(xiaoming@163.com);         name.setattribute(id);         // 设置子节点         linkman.addcontent(name);         linkman.addcontent(email);         // 将linkman加入根子节点         addresslist.addcontent(linkman);         // 用来输出xml文件         xmloutputter out = new xmloutputter();         // 设置输出编码         out.setformat(out.getformat().setencoding(gbk));         // 输出xml文件         try {             out.output(doc, new fileoutputstream(jdom_write.xml));         } catch (filenotfoundexception e) {             e.printstacktrace();         } catch (ioexception e) {             e.printstacktrace();         }     } }
// jdom_write.xml <?xml version="1.0" encoding="gbk"?> <addresslist>     <linkman>         <name id="xm">小明</name>         <email>xiaoming@163.com</email>     </linkman> </addresslist>
使用jdom读取xml文件
package com.jdom.demo; import java.io.ioexception; import java.util.list; import org.jdom.document; import org.jdom.element; import org.jdom.jdomexception; import org.jdom.input.saxbuilder; public class readxml {     public static void main(string[] args) throws jdomexception, ioexception {         //建立sax解析         saxbuilder builder = new saxbuilder();         //找到document         document readdoc = builder.build(jdom_write.xml);         //读取根元素         element stu = readdoc.getrootelement();         //得到全部linkman子元素         list list = stu.getchildren(linkman);         for (int i = 0; i < list.size(); i++) {             element e = (element) list.get(i);             string name = e.getchildtext(name);             string id = e.getchild(name).getattribute(id).getvalue();             string email = e.getchildtext(email);             system.out.println(----联系人----);             system.out.println(姓名: + name + 编号: + id);             system.out.println(email: + email);         }     } }
jdom是一种常见的操作组件
在实际的开发中使用非常广泛。
2.4、解析工具:dom4j
dom4j也是一组xml操作组件包,主要用来读写xml文件,由于dom4j性能优异、功能强大,且具有易用性,所以现在已经被广泛地应用开来。如,hibernate、spring框架中都使用了dom4j进行xml的解析操作。
开发时需要引入的jar包:dom4j-1.6.1.jar、lib/jaxen-1.1-beta-6.jar
dom4j中的所用操作接口都在org.dom4j包中定义。其他包根据需要把选择使用。
dom4j的主要接口
用dom4j生成xml文件:
package com.dom4j.demo; import java.io.file; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.io.unsupportedencodingexception; import org.dom4j.document; import org.dom4j.documenthelper; import org.dom4j.element; import org.dom4j.io.outputformat; import org.dom4j.io.xmlwriter; public class dom4jwrite {     public static void main(string[] args) {         // 创建文档         document doc = documenthelper.createdocument();         // 定义个节点         element addresslist = doc.addelement(addresslist);         element linkman = addresslist.addelement(linkman);         element name = linkman.addelement(name);         element email = linkman.addelement(email);         // 设置节点内容         name.settext(小明);         email.settext(xiaoming@163.com);         // 设置输出格式         outputformat format = outputformat.createprettyprint();         // 指定输出编码         format.setencoding(gbk);         try {             xmlwriter writer = new xmlwriter(new fileoutputstream(new file(                     dom4j_demo.xml)), format);             writer.write(doc);             writer.close();         } catch (unsupportedencodingexception e) {             e.printstacktrace();         } catch (filenotfoundexception e) {             e.printstacktrace();         } catch (ioexception e) {             e.printstacktrace();         }     } }
// dom4j_demo.xml <?xml version="1.0" encoding="gbk"?> <addresslist>   <linkman>     <name>小明</name>     <email>xiaoming@163.com</email>   </linkman> </addresslist>
用dom4j读取xml文件:
package com.dom4j.demo; import java.io.file; import java.util.iterator; import org.dom4j.document; import org.dom4j.documentexception; import org.dom4j.element; import org.dom4j.io.saxreader; public class dom4jread {     public static void main(string[] args) {         //读取文件         file file = new file(dom4j_demo.xml);         //建立sax解析读取         saxreader reader = new saxreader();         document doc = null;         try {             //读取文档             doc = reader.read(file);         } catch (documentexception e) {             e.printstacktrace();         }         //取得根元素         element root = doc.getrootelement();         //取得全部的子节点         iterator iter = root.elementiterator();         while (iter.hasnext()) {             //取得每一个linkman             element linkman = (element) iter.next();             system.out.println(姓名:+linkman.elementtext(name));             system.out.println(邮件地址:+linkman.elementtext(email));         }     } }
小结xml主要用于数据交换,而html则用于显示。
java直接提供的xml解析方式分为两种,即dom和sax。这两种解析的区别如下:
dom解析是将所有内容读取到内存中,并形成内存树,如果文件量较大则无法使用,但是dom解析可以进行文件的修改
sax解析是采用顺序的方式读取xml文件中,不受文件大小限制,但是不允许修改。
xml解析可以使用jdom和dom4j第三方工具包,以提升开发效率。
以上就是xml解析基础的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product