欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 解析XML数据的4种方式

程序员文章站 2022-06-14 23:13:35
解析的四种方式 dom 解析 sax 解析 jdom 解析 dom4j 解析 案例实操dom 解析dom(document object model, 文档对象模型),在应用程序中,基于 d...

解析的四种方式

  • 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的资料请关注其它相关文章!

相关标签: Java 解析 xml