java dom解析xml字符串_dom4j解析xml字符串实例

java部分

DOM4J

与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。

先来看看dom4j中对应XML的DOM树建立的继承关系

636dea72ee89128054b24e8747f461a5.png

针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:

94ce43f1746d9ccdfe7032ebcbfcd12c.png

同时,dom4j的NodeType枚举实现了XML规范中定义的node类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。

常用API

class org.dom4j.io.SAXReader

read 提供多种读取xml文件的方式,返回一个Domcument对象

interface org.dom4j.Document

iterator 使用此法获取node

getRootElement 获取根节点

interface org.dom4j.Node

getName 获取node名字,例如获取根节点名称为bookstore

getNodeType 获取node类型常量值,例如获取到bookstore类型为1——Element

getNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Element

interface org.dom4j.Element

attributes 返回该元素的属性列表

attributeValue 根据传入的属性名获取属性值

elementIterator 返回包含子元素的迭代器

elements 返回包含子元素的列表

interface org.dom4j.Attribute

getName 获取属性名

getValue 获取属性值

interface org.dom4j.Text

getText 获取Text节点值

interface org.dom4j.CDATA

getText 获取CDATA Section值

interface org.dom4j.Comment

getText 获取注释

环境:

Dom4j-1.6.1

Dom4j解析需要XML需要的最小类库为:

dom4j-1.6.1.jar

jaxen-1.1-beta-6.jar

目标:

解析一个xml,输出所有的属性和元素值。

测试代码:

XML文件:

zhangsan

32

home add

com add

lisi

22

home add

com add

com add

解析代码:

packagecom.topsoft.test;importorg.dom4j.io.SAXReader;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.Node;importjava.util.Iterator;importjava.util.List;importjava.io.InputStream;/*** Created by IntelliJ IDEA.

* User: leizhimin

* Date: 2008-3-26 15:53:51

* Note: Dom4j遍历解析XML测试*/

public classTestDom4j {/*** 获取指定xml文档的Document对象,xml文件必须在classpath中可以找到

*

*@paramxmlFilePath xml文件路径

*@returnDocument对象*/

public staticDocument parse2Document(String xmlFilePath) {

SAXReader reader= newSAXReader();

Document document= null;try{

InputStream in= TestDom4j.class.getResourceAsStream(xmlFilePath);

document=reader.read(in);

}catch(DocumentException e) {

System.out.println(e.getMessage());

System.out.println("读取classpath下xmlFileName文件发生异常,请检查CLASSPATH和文件名是否存在!");

e.printStackTrace();

}returndocument;

}public static voidtestParseXMLData(String xmlFileName) {//产生一个解析器对象

SAXReader reader = newSAXReader();//将xml文档转换为Document的对象

Document document =parse2Document(xmlFileName);//获取文档的根元素

Element root =document.getRootElement();//定义个保存输出xml数据的缓冲字符串对象

StringBuffer sb = newStringBuffer();

sb.append("通过Dom4j解析XML,并输出数据:\n");

sb.append(xmlFileName+ "\n");

sb.append("----------------遍历start----------------\n");//遍历当前元素(在此是根元素)的子元素

for (Iterator i_pe =root.elementIterator(); i_pe.hasNext();) {

Element e_pe=(Element) i_pe.next();//获取当前元素的名字

String person =e_pe.getName();//获取当前元素的id和sex属性的值并分别赋给id,sex变量

String id = e_pe.attributeValue("id");

String sex= e_pe.attributeValue("sex");

String name= e_pe.element("name").getText();

String age= e_pe.element("age").getText();//将数据存放到缓冲区字符串对象中

sb.append(person + ":\n");

sb.append("\tid=" + id + " sex=" + sex + "\n");

sb.append("\t" + "name=" + name + " age=" + age + "\n");//获取当前元素e_pe(在此是person元素)下的子元素adds

Element e_adds = e_pe.element("adds");

sb.append("\t" + e_adds.getName() + "\n");//遍历当前元素e_adds(在此是adds元素)的子元素

for (Iterator i_adds =e_adds.elementIterator(); i_adds.hasNext();) {

Element e_add=(Element) i_adds.next();

String code= e_add.attributeValue("code");

String add=e_add.getTextTrim();

sb.append("\t\t" + e_add.getName() + ":" + " code=" + code + " value=\"" + add + "\"\n");

}

sb.append("\n");

}

sb.append("-----------------遍历end-----------------\n");

System.out.println(sb.toString());

System.out.println("---------通过XPath获取一个元素----------");

Node node1= document.selectSingleNode("/doc/person");

System.out.println("输出节点:" +

"\t"+node1.asXML());

Node node2= document.selectSingleNode("/doc/person/@sex");

System.out.println("输出节点:" +

"\t"+node2.asXML());

Node node3= document.selectSingleNode("/doc/person[name=\"zhangsan\"]/age");

System.out.println("输出节点:" +

"\t"+node3.asXML());

System.out.println("\n---------XPath获取List节点测试------------");

List list= document.selectNodes("/doc/person[name=\"zhangsan\"]/adds/add");for(Iterator it=list.iterator();it.hasNext();){

Node nodex=(Node)it.next();

System.out.println(nodex.asXML());

}

System.out.println("\n---------通过ID获取元素的测试----------");

System.out.println("陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!");

String id22= document.elementByID("22").asXML();

String id23= document.elementByID("23").asXML();

String id24= null;if (document.elementByID("24") != null) {

id24= document.elementByID("24").asXML();

}else{

id24= "null";

}

System.out.println("id22= " +id22);

System.out.println("id23= " +id23);

System.out.println("id24= " +id24);

}public static voidmain(String args[]) {

testParseXMLData("/person.xml");

}

}

运行结果:

通过Dom4j解析XML,并输出数据:

/person.xml

----------------遍历start----------------

person:

id=1 sex=m

name=zhangsan age=32

adds

add: code=home value="home add"

add: code=com value="com add"

person:

id=2 sex=w

name=lisi age=22

adds

add: code=home value="home add"

add: code=com value="com add"

add: code=com value="com add"

-----------------遍历end-----------------

---------通过XPath获取一个元素----------

输出节点:

zhangsan

32

home add

com add

输出节点: sex="m"

输出节点:32---------XPath获取List节点测试------------home add

com add---------通过ID获取元素的测试----------

陷阱:通过ID获取,元素ID属性名必须为“大写ID”,小写的“id”会认为是普通属性!

id22=home addid23=com addid24= null

Process finished with exit code 0

实例一:

//先加入dom4j.jar包

importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.DocumentHelper;importorg.dom4j.Element;/*** @Title: TestDom4j

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值