首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

Dom4j 解析Xml文档及 XPath查询 学习札记

2013-03-26 
Dom4j 解析Xml文档及 XPath查询学习笔记本文查阅方法:??? 1、查阅目录 —— 查阅本文目录,确定想要查阅的目录

Dom4j 解析Xml文档及 XPath查询 学习笔记


本文查阅方法:
??? 1、查阅目录 —— 查阅本文目录,确定想要查阅的目录标题
??? 2、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,
???????????? 在查找搜索框中 输入需要查阅的 目录标题,便可以直接到达 标题内容 的位置。
??? 3、学习小结 —— 文中的学习小结内容,是笔者在学习之后总结出的,开发时可直接参考其进行应用开发的内容, 进一步加快了本文的查阅 速度。(水平有限,仅供参考。)

?

?

?

?

本文目录

?

????学习小结

?

???? 1、Dom4j?概述
?????2、获取?Document对象
?????3、将文档(document)写入XML文件/更新XML文件?????

?

?????4、获取/操作?节点对象?

?

???????????(1)获取文档的根节点.

?

???????????(2)取得某个节点指定名称的子节点.

?

???????????(3)取得节点的文字

?

???????????(4)取得某节点下所有?指定名称?的子节点,并进行遍历.??

?

???????????(5)对某节点下的所有子节点进行遍历.??

?

???????????(6)在某节点下添加子节点.

?

???????????(7)设置节点文字.?

?

???????????(8)删除某节点.?//childElm是待删除的节点,parentElm是其父节点

?

???????????(9)Dom4j在指定位置插入节点?

?

???????????(10)添加一个CDATA节点.?

?

??????5、获取/操作?节点对象属性

?

???????????(1)取得某节点下的某属性对象?

?

???????????(2)取得属性的文字

?

???????????(3)删除某属性??

?

???????????(4)遍历某节点的所有属性????

?

???????????(5)设置某节点的属性和文字.

?

???????????(6)设置属性的文字

?

??????6、字符串与XML的转换?

?

??????????(1)将字符串转化为XML?

?

??????????(2)文档或节点的XML转化为字符串.?

?

?????7、操作xml节点?以及节点属性的?Demo范例集合
?????8、XPath:超级强大的Xml文档?节点查询定位?技术
?????9、XPath??使用方法范例Demo?

?

?

?

?

?

?

学习小结

?

? (一)?使用Dom4j?操作Xml文档的三个步骤:
???? (1)获取document对象:
??????????SAXReader?reader?=?new?SAXReader();??????????????
??????????Document??document?=?reader.read(new?File("input.xml"));
?????(2)操作节点对象及其属性
????????? A.使用XPath方式?查询获取节点
??????????????a.查询仅单个节点:document.selectSingleNode("查询表达式");?
????????????? b.查询多个节点:??document.selectNodes("查询表达式");?
???????????B.普通方式获取节点。
??????????????Element?root?=?document.getRootElement();?????
?????(3)将document对象写回到xml文档
??????????OutputFormat?format?=?OutputFormat.createPrettyPrint();??
??????????format.setEncoding("UTF-8");??//?指定XML编码?
??????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("output.xml"),format);?
??????????writer.write(document);???
??????????writer.close();

?

? (二)"从无到有"生成document对象
?????(1)解析XML形式的文本,得到document对象.?
??????????String?text?=?"<members></members>";???//创建根节点???????????
??????????Document?document?=?DocumentHelper.parseText(text);
?????(2)主动创建document对象.?
??????????Document?document?=?DocumentHelper.createDocument();??
??????????Element?root?=?document.addElement("members");//创建根节点?

?

?

?

?

??

?

1、Dom4j?概述

?

????Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。?

?

????Dom4j是一个非常优秀的Java?XML?API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

?

????使用Dom4j开发,需下载dom4j相应的jar文件。

?

????备注:在使用Dom4j开发中,要导入一些类的包时,一定要导入Dom4j的自己的包名,否则就会出现需要转类型的提示信息。若是强行转换,则将无法使用Dom4j提供的强大的功能的良好的性能。

?

?

?

?

?

?

2、获取?Document对象

?

????DOM4j中,获得Document对象的方式有三种:?

?

??????(1)读取XML文件,获得document对象【有源模式:源Xml文档必须已经存在】????????????

?

???????????SAXReader?reader?=?new?SAXReader();??????????????

?

???????????Document???document?=?reader.read(new?File("input.xml"));

?

?????

?

??????(2)解析XML形式的文本,得到document对象.?【无源模式:无需存在源Xml文档】

?

???????????String?text?=?"<members></members>";???//创建根节点???????????

?

???????????Document?document?=?DocumentHelper.parseText(text);

?

?????

?

??????(3)主动创建document对象.【无源模式:无需存在源Xml文档】?

?

???????????Document?document?=?DocumentHelper.createDocument();??

?

???????????Element?root?=?document.addElement("members");//创建根节点?

?

?

?

?

???

?

3、将文档(document)写入XML文件/更新XML文件??.?

?

????(1)文档中全为英文,不设置编码,直接写入的形式.???

?

????????XMLWriter?writer?=?new?XMLWriter(new??FileWriter("output.xml"));???

?

????????writer.write(document);???

?

????????writer.close();?????

?

????(2)文档中含有中文,设置编码格式写入的形式.?

?

????????OutputFormat?format?=?OutputFormat.createPrettyPrint();???//?Pretty?[?priti]???

?

????????????????//?format?[?f?:m?t]???????????

?

????????format.setEncoding("GBK");??//?指定XML编码?

?

????????XMLWriter?writer?=?new?XMLWriter(newFileWriter("output.xml"),format);?

?

????????writer.write(document);?????//注:为避免编码问题,此处也可使用new?FileOutputStream("").

?

????????writer.close();

?

?

?

?

?

?

4、获取/操作?节点对象?

?

????(1)获取文档的根节点.

?

??????????Demo样例:Element?root?=?document.getRootElement();?????

?

????(2)取得某个节点指定名称的子节点.

?

??????????Demo样例:Element?childElement=anyNode.element(“书名");?????

?

????(3)取得节点的文字

?

??????????Demo样例:?String?text=anyNode.getText();?

?

????(4)取得某节点下所有?指定名称?的子节点,并进行遍历.??

?

??????????Demo样例:?

?

????????????List?nodes?=?element.elements("member");?????

?

????????????for?(Iterator?it?=?nodes.iterator();?it.hasNext();)?{??????

?

????????????????Element?element?=?(Element)?it.next();??

?

????????????????//do?something??

?

????????????}?????

?

????(5)对某节点下的所有子节点进行遍历.?????

?

???????????for(Iterator?it=element.elementIterator();it.hasNext();){????????

?

????????????????Element?element?=?(Element)?it.next();?

?

????????????????//do?something?????

?

???????????}

?

????(6)在某节点下添加子节点.?

?

??????????Element?ageElement??=?element.addElement("age");

?

????(7)设置节点文字.??

?

??????????element.setText("29");?????

?

????(8)删除某节点.?//childElm是待删除的节点,parentElm是其父节点

?

??????????parentElm.remove(childElm);?

?

????(9)Dom4j在指定位置插入节点?

?

????????a.得到插入位置的节点列表(list)

?

????????b.调用list.add(index,elemnent),由index决定element的插入位置。

?

????????????Element元素可以通过DocumentHelper对象得到。

?

????????????示例代码:?

?

????????????????Element?aaa?=?DocumentHelper.createElement("aaa");

?

????????????????aaa.setText("aaa");?

?

????????????????List?list?=?root.element("书").elements();

?

????????????????list.add(1,?aaa);?

?

?

?

????(10)添加一个CDATA节点.?

?

??????????Element?contentElm?=?infoElm.addElement("content");?

?

??????????contentElm.addCDATA(diary.getContent());

?

?

?

?

5、获取/操作?节点对象属性 

?

????(1)取得某节点下的某属性对象?????

?

????????Element?root=document.getRootElement();???

?

????????Attribute?attribute=root.attribute("size");?//属性名name?

?

????(2)取得属性的文字?????

?

????????String?text=attribute.getText();?

?

????(3)删除某属性??

?

????????Attribute?attribute=root.attribute("size");??

?

????????root.remove(attribute);

?

????(4)遍历某节点的所有属性????

?

????????Element?root=document.getRootElement();????????

?

????????for(Iterator?it=root.attributeIterator();it.hasNext();){??????????

?

????????????Attribute?attribute?=?(Attribute)?it.next();??????????

?

????????????String?text=attribute.getText();??????????

?

????????????System.out.println(text);?????

?

????????}?

?

????(5)设置某节点的属性和文字.????

?

????????newMemberElm.addAttribute("name",?"sitinspring");?????

?

????(6)设置属性的文字????

?

????????Attribute?attribute=root.attribute("name");????

?

????????attribute.setText("sitinspring");?

?

?????

?

?

?

6、字符串与XML的转换?

?

????(1)将字符串转化为XML??

?

????????String?text?=?"<members>?<member>sitinspring</member></members>";?

?

????????Document?document?=?DocumentHelper.parseText(text);?

?

????(2)文档或节点的XML转化为字符串.?

?

????????SAXReader?reader?=?new?SAXReader();?

?

????????Document???document?=?reader.read(new?File("input.xml"));???????????

?

????????String?docXmlText=document.asXML();?

?

?

?

????????Element?root=document.getRootElement();???

?

????????String?rootXmlText=root.asXML();?

?

?

?

????????Element?memberElm=root.element("member");?

?

????????String?memberXmlText=memberElm.asXML();?

?

?

?

?????【备注:其他的API可参见 附件资料:《dom4jAPI帮助文档》】

?

?

?

?

?7、操作xml节点?以及节点属性的?Demo范例集合

?

?

?

//dom4j解析xml文档

?

public?class?Demo1?{?

?

??//遍历xml文档所有标签

?

??????@Test

?

??????public?void?listFile()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));

?

????????????Element?root?=?document.getRootElement();

?

????????????list(root);

?

??????}?

?

??????public?void?list(Element?e){

?

????????????System.out.println(e.getName());

?

????????????List<Element>?list?=?e.elements();

?

????????????for(Element?child?:?list){

?

??????????????????list(child);

?

????????????}

?

??????}

?

?

?

??//获取:<书名?name="aaa">javaweb开发</书名>?节点内容

?

??????@Test

?

??????public?void?test1()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));

?

????????????String?value?=?document.getRootElement().element("书").element("书名").getText();

?

????????????System.out.println(value);

?

??????}

?

?

?

??//获取:<书名?name="aaa">javaweb开发</书名>?节点属性

?

??????@Test

?

??????public?void?test2()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));

?

????????????Element?bookname?=?document.getRootElement().element("书").element("书名");

?

????????????System.out.println(bookname.attributeValue("name"));

?

??????}

?

?

?

??//向xml文档中添加一个售价节点

?

??????@Test

?

??????public?void?test3()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));?

?

????????????//创建要添加的节点

?

????????????Element?e?=?DocumentHelper.createElement("售价");

?

????????????e.setText("39元");?

?

????????????//把节点挂到书下

?

????????????document.getRootElement().element("书").add(e);?

?

????????????//把更新的内容写回到xml??docunment(UTF-8)

?

????????????/*XMLWriter?writer?=?new?XMLWriter(new?OutputStreamWriter(new?FileOutputStream("src/book.xml"),"UTF-8"));

?

????????????writer.write(document);

?

????????????writer.close();*/?

?

?????

?

????????????/*XMLWriter?writer?=?new?XMLWriter(new?FileWriter("src/book.xml"));

?

????????????writer.write(document);

?

????????????writer.close();*/

?

?????????

?

????????????/*OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");*/?

?

????????

?

????????????OutputFormat?format?=?OutputFormat.createCompactFormat();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);????//推荐这种XML输出流,防止乱码的出现。

?

????????????writer.close();?

?

??????}

?

?

?

??//向xml文档中添加一个售价节点

?

??????@Test

?

??????public?void?test4()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));?

?

????????????document.getRootElement().element("书").addElement("售价").setText("189元");?

?

????????????OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);

?

????????????writer.close();?

?

??????}

?

?

?

??//向xml文档的指定位置添加一个售价节点

?

??????@Test

?

??????public?void?test5()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));?

?

????????????//创建要添加的节点

?

????????????Element?e?=?DocumentHelper.createElement("售价");

?

????????????e.setText("39元");?

?

????????????List?list?=?document.getRootElement().element("书").elements();

?

????????????list.add(2,?e);?

?

????????????OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);

?

????????????writer.close();

?

??????}

?

?

?

??//删除节点

?

??????@Test

?

??????public?void?test6()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));?

?

????????????Element?e?=?(Element)?document.getRootElement().element("书").elements("售价").get(1);

?

????????????e.getParent().remove(e);?

?

????????????//更新

?

????????????OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);

?

????????????writer.close();

?

??????}

?

?

?

??//修改节点的值:第二本书售价的值

?

??????@Test

?

??????public?void?test7()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));?

?

????????????Element?e?=?(Element)?document.getRootElement().elements("书").get(1);

?

????????????e.element("售价").setText("890元");?

?

????????????//更新

?

????????????OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);

?

????????????writer.close();

?

??????}

?

?

?

??//??根据节点里的内容删除内容所在的节点?

?

??????@Test

?

??????public?void?test8()?throws?DocumentException,?IOException{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));

?

????????????Element?root?=?document.getRootElement();

?

????????????list1(root);?

?

????????????//更新

?

????????????OutputFormat?format?=?OutputFormat.createPrettyPrint();

?

????????????format.setEncoding("UTF-8");

?

????????????XMLWriter?writer?=?new?XMLWriter(new?FileOutputStream("src/book.xml"),format);

?

????????????writer.write(document);

?

????????????writer.close();

?

??????}

?

?

?

??????public?void?list1(Element?e){

?

????????????String??value?=?e.getText();

?

????????????if("JavaScript网页开发".equals(value)){

?

??????????????????e.getParent().remove(e);

?

????????????}

?

????????????List<Element>?list?=?e.elements();

?

????????????for(Element?child?:?list){

?

??????????????????list1(child);

?

????????????}

?

??????}?

?

}

?

?

?

?

?

?

?8、XPath:超级强大的Xml文档 节点查询定位 技术

?

????XPath?是dom4j组织提供的非常强大的 Xml文档?节点查询定位?技术?,利用它可以非常快速的定位并获取到所需要的节点对象。甚至可以对查询条件设置很多的限定约束。

?

????基本应用语法:

?

????????(1)查询仅单个节点:document.selectSingleNode("查询表达式");?

?

????????(2)查询多个节点:? document.selectNodes("查询表达式");?

?

????其中的查询表达式 使其实现快速查询定位关键,XPath中各种丰富的查询表达式语法 学习 附件资料《XPath?Tutorial(菜鸟必备)》 ,资料中共列出了 近22种实例 供大家学习。

?

????其使用方法则参加下面的范例Demo

?

????

?

?

9、XPath??使用方法范例Demo?

?

?

?

public?class?Demo2?{?

?

?//?简单查询条件的应用?

?

??????@Test???

?

??????public?void?test1()?throws?Exception{

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/book.xml"));

?

?????????

?

????????????Element?e?=?(Element)?document.selectSingleNode("//作者");

?

????????????System.out.println(e.getText());

?

?????????

?

????????????Element?e1?=?(Element)?document.selectNodes("//作者").get(1);

?

????????????System.out.println(e1.getText());

?

??????}

?

?

?

??// 复杂查询条件 。实现用户名和密码校验功能。重点参考,非常好

?

??????@Test

?

??????public?void?test2()?throws?Exception{

?

????????????String?username?=?"aaa1";

?

????????????String?password?=?"123";

?

?????????

?

????????????SAXReader?reader?=?new?SAXReader();

?

????????????Document?document?=?reader.read(new?File("src/users.xml"));

?

?????????

?

????????????Node?node?=?document.selectSingleNode("//user[@username='"+username+"'?and?@password='"+password+"']");

?

????????????if(node!=null){

?

??????????????????System.out.println("登陆成功!!");

?

????????????}else{

?

??????????????????System.out.println("用户名或密码错误,登陆失败!!");

?

????????????}?

?

??????}?

?

}

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

热点排行