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("用户名或密码错误,登陆失败!!");
?
????????????}?
?
??????}?
?
}
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?