当前位置: 移动技术网 > IT编程>开发语言>Java > Java 解析XML数据的4种方式

Java 解析XML数据的4种方式

2020年09月02日  | 移动技术网IT编程  | 我要评论
解析的四种方式 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的资料请关注移动技术网其它相关文章!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网