Java 解析XML数据的4种方式
解析的四种方式
- dom 解析
- sax 解析
- jdom 解析
- dom4j 解析
案例实操
dom 解析
dom(document object model, 文档对象模型),在应用程序中,基于 dom 的 xml 分析器将一个 xml 文档转换成一个对象模型的集合(通常称为 dom 树 ),应用程序正是通过对这个对象模型的操作,来实现对 xml 文档数据的操作。xml 本身是以树状的形式出现的,所以 dom 操作的时候,也将按章树的形式进行转换。在整个 dom 树中,最大的地方指的是 document,表示一个文档,在这个文档中只存在一个根节点。
注意:在使用 dom 操作的时候,每一个文字的区域也是一个节点,称为文本节点。
核心操作接口
在 dom 解析中有以下四个核心的操作接口:
document:此接口代表了整个 xml 文档,表示的是整棵 dom 树的根,提供了对文档中的数据进行访问和操作的入口,通过 document 节点可以访问 xml 文件中所有的元素内容。
node:此接口在整个 dom 树中具有举足轻重的地位,dom 操作的核心接口中有很大一部分接口是从 node 接口继承过来的。例如:document、element 等接口,在 dom 树中,每一个 node 接口代表了 dom 树中的一个节点。
nodelist:此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,例如: 一个节点的子节点,当文档改变的时候会直接影响到 nodelist 集合。
namednodemap:此接口表示的是一组节点和其唯一名字对应的一一对应关系,本接口主要用于属性节点的表示上。
dom 解析过程
如果一个程序需要进行 dom 解析读取操作的话,也需要按照如下的步骤进行:
建立 documentbuilderfactory : documentbuilderfactory factory = documentbuilderfactory.newinstance();
建立 documentbuilder: documentbuilder builder = factory.newdocumentbuilder();
建立 document : document doc = builder.parse(“要解析的文件路径”);
建立 nodelist : nodelist nl = doc.getelementsbytagname(“读取节点”);
进行 xml 信息读取
sax 解析
sax(simple api for xml)解析是按照 xml 文件的顺序一步一步的来解析。sax 没有官方的标准机构,它不属于任何标准组织或团体,也不属于任何公司或个人,而是提供任何人使用的一种计算机技术。
sax(simple api for xml,操作 xml 的简单接口),与 dom 操作不同的是,sax 采用的是一种顺序的模式进行访问,是一种快速读取 xml 数据的方式。当使用 sax 解析器进行操作的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,并由这些操作方法作出相应的操作,直至整个文档扫描结束。
如果要想实现这种 sax 解析,则肯定首先建立一个 sax 的解析器。
// 1、创建解析器工厂 saxparserfactory factory = saxparserfactory.newinstance(); // 2、获得解析器 saxparser parser = factory.newsaxparser(); // sax 解析器 ,继承 defaulthandler string path = new file("resource/demo01.xml").getabsolutepath(); // 解析 parser.parse(path, new mysaxhandler());
jdom 解析
在 w3c 本身提供的 xml 操作标准,dom 和 sax,但是从开发角度上看,dom 和 sax 本身是各有特点的,dom 可以修改,但不适合读取大文件,而 sax 可以读取大文件, 但是本身不能修改。所谓的 jdom = dom 的可修改 + sax 的读取大文件 ,jdom 本身是一个免费的开源组件,直接从上下载。
- jdom 操作 xml 常用类:
- document:表示整个xml文档,是一个树形结构
- eelment:表示一个xml的元素,提供方法操作其子元素,如文本,属性和名称空间等
- attribute:表示元素包含的属性
- text:表示xml文本信息
- xmloutputter:xml输出流,底层是通过jdk中流实现
- format:提供xml文件输出的编码、样式和排版等设置
我们发现 jdom 的输出操作要比传统的 dom 方便得多,而且也更加直观,包括在输出的时候都很容易了。此时观察到的是 jdom 对于 dom 解析的支持,但是也说,jdom 本身也支持了 sax 的特点;所以,可以使用 sax 进行解析操作。
// 获取 sax 解析器 saxbuilder builder = new saxbuilder(); file file = new file("resource/demo01.xml"); // 获取文档 document doc = builder.build(new file(file.getabsolutepath())); // 获取根节点 element root = doc.getrootelement(); system.out.println(root.getname()); // 获取根节点下所有的子节点, 也可以根据标签名称获取指定的直接点 list<element> list = root.getchildren(); system.out.println(list.size()); for(int x = 0; x<list.size(); x++){ element e = list.get(x); // 获取元素的名称和里面的文本 string name = e.getname(); system.out.println(name + "=" + e.gettext()); system.out.println("=================="); }
dom4j 解析
dom4j 是一个简单的开源库,用于处理 xml、 xpath 和 xslt,它基于 java 平台,使用 java 的集合框架,全面集成了 dom,sax 和 jaxp。下载路径:
dom4j 与 jdom 一样都属于一个免费的 xml 开源组件,但是由于现在的开发框架中使用该技术较多,比如 hibernate、spring 等都使用 dom4j 这个功能,所以作为介绍,大家可以对该组件有一个了解。并没有谁好谁坏,一般框架使用 dom4j 较多,而我们平时如果要用则 jdom 较常见。可以发现 dom4j 发挥了很多新特性,比如输出格式就可以很好。
file file = new file("resource/outputdom4j.xml"); saxreader reader = new saxreader(); // 读取文件作为文档 document doc = reader.read(file); // 获取文档的根元素 element root = doc.getrootelement(); // 根据跟元素找到全部的子节点 iterator<element> iter = root.elementiterator(); while(iter.hasnext()){ element name = iter.next(); system.out.println("value = " + name.gettext()); }
扩展~xml的创建
dom 创建
如果想要生成 xml 文件,则在创建文档的时候,就应该使用 newdocument() 方法
如果要将 dom 的文档输出,本身是比较麻烦的 。一次编写多次 copy
public static void createxml() throws exception{ //获取解析器工厂 documentbuilderfactory factory=documentbuilderfactory.newinstance(); //获取解析器 documentbuilder builder=factory.newdocumentbuilder(); //创建文档 document doc=builder.newdocument(); //创建元素、设置关系 element root=doc.createelement("people"); element person=doc.createelement("person"); element name=doc.createelement("name"); element age=doc.createelement("age"); name.appendchild(doc.createtextnode("lebyte")); age.appendchild(doc.createtextnode("10")); doc.appendchild(root); root.appendchild(person); person.appendchild(name); person.appendchild(age); //写出去 // 获得变压器工厂 transformerfactory tsf=transformerfactory.newinstance(); transformer ts=tsf.newtransformer(); //设置编码 ts.setoutputproperty(outputkeys.encoding, "utf-8"); //创建带有 dom 节点的新输入源,充当转换 source 树的持有者 domsource source=new domsource(doc); //充当转换结果的持有者 file file=new file("src/output.xml"); streamresult result=new streamresult(file); ts.transform(source, result); }
sax 创建
//创建一个saxtransformerfactory对象 saxtransformerfactory stf = (saxtransformerfactory) saxtransformerfactory.newinstance(); try { //通过saxtransformerfactory对象创建一个transfomerhandler对象 transformerhandler handler = stf.newtransformerhandler(); //通过transformerhandler对象创建一个transformer对象 transformer tf = handler.gettransformer(); //设置transfomer对象的属性 tf.setoutputproperty(outputkeys.encoding, "utf-8"); tf.setoutputproperty(outputkeys.indent, "yes"); //创建一个result的对象,将其与handler关联 file file = new file("src/output.xml"); if(!file.exists()){ file.createnewfile(); } result result = new streamresult(new fileoutputstream(file)); handler.setresult(result); //通过handler编写xml的内容 //打开document handler.startdocument(); attributesimpl attr = new attributesimpl(); //创建根节点bookstore handler.startelement("", "", "bookstore", attr); attr.clear(); attr.addattribute("", "", "id", "", "1"); handler.startelement("", "", "book", attr); attr.clear(); handler.startelement("", "", "name", attr); handler.characters("颈椎病康复指南".tochararray(), 0, "颈椎病康复指南".length()); handler.endelement("","","name"); //关闭各节点 handler.endelement("", "", "book"); handler.endelement("", "", "bookstore"); handler.enddocument(); } catch (saxexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (filenotfoundexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (transformerconfigurationexception e) { // todo auto-generated catch block e.printstacktrace(); }
jdom 创建
// 创建节点 element person = new element("person"); element name = new element("name"); element age = new element("age"); // 创建属性 attribute id = new attribute("id","1"); // 设置文本 name.settext("lebyte"); age.settext("10"); // 设置关系 document doc = new document(person); person.addcontent(name); name.setattribute(id); person.addcontent(age); xmloutputter out = new xmloutputter(); file file = new file("resource/outputjdom.xml"); out.output(doc, new fileoutputstream(file.getabsolutefile()));
dom4j 创建
// 使用 documenthelper 来创建 document 对象 document document = documenthelper.createdocument(); // 创建元素并设置关系 element person = document.addelement("person"); element name = person.addelement("name"); element age = person.addelement("age"); // 设置文本 name.settext("lebyte"); age.settext("10"); // 创建格式化输出器 outputformat of = outputformat.createprettyprint(); of.setencoding("utf-8"); // 输出到文件 file file = new file("resource/outputdom4j.xml"); xmlwriter writer = new xmlwriter(new fileoutputstream(new file(file.getabsolutepath())),of); // 写出 writer.write(document); writer.flush(); writer.close();
以上就是java 解析xml数据的4种方式的详细内容,更多关于java 解析xml的资料请关注其它相关文章!