经常使用框架(Dom4j)html
一、XMLjava
基本的定义编程
xml是一种标记语言 //标准的html,html是xml的一个子集 <html> <head><title>标题</title></head> <body> </body> </html> //标准的xml,xml能够任意定义元素 <books> <book> <id></id> <title></title> <author></author> </book> </books> //不合法的xml,xml不能出现循环嵌套 <id> <head> </id> </head> //也是不合法的,xml必须有结束 <id><head></id> //合法的,节点能够自结束 <id> <head/> </id> <book id="1"> //id表示的是book的属性(Attribute)--book是一个节点(Node|Element) <title>java编程思想</title> //title也是一个Node,java编程思想 也是一个Node(文本节点) </book>
使用XML能够有效的实现对象到字符串的转换网络
public class Book { private int id; private String title; private String author; private double price; Book b = new Book(); b.setId(Integer.parseInt(ele.attributeValue("id"))); b.setTitle(ele.elementText("title")); b.setAuthor(ele.elementText("author")); b.setPrice(Double.parseDouble(ele.elementText("price"))); <book id="1"> <title>Java编程思想</title> <author>Bruce Eckel</author> <price>69.00</price> </book>
基于Java处理XML框架
dom4j-->不是j2se所自带的,须要经过网络下载这个文件包才能使用。dom
dom4j的安装函数
一、下载dom4j工具
对于全部的基于java的第三方工具,下载的地点只有一个选择:官方网站。学习
下载的选择:版本选择测试
xxx-1.6.0-SNAPSHOT.jar(快照版本,内部都没有通过测试的版本)
xxx-alpha.jar(表示的alpha版本,这种版本表示内部测试版)
xxx-beta.jar(内部测试已经完成,外部测试版本)
以上版本能够在学习的时候使用,可是绝对不能用于正式的项目。
xxx-release.jar(已经发布的版本)
xxx-GA.jar(彻底稳定版本)
release和GA的版本是能够直接使用的版本。
二、将jar包添加到环境变量
经常使用的方式
一、在项目中建立一个Folder(建议的名称就是lib)
二、将dom4j中的lib中的文件和dom4j.jar拷贝到这个lib中
三、将这些文件添加到buildpath中
若是出现如下就表示添加成功
三、写一个类测试dom4j
import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Test01 { public static void main(String[] args) { try { SAXReader reader = new SAXReader(); Document d = reader.read(new File("d:/test/test.xml")); System.out.println(d); } catch (DocumentException e) { e.printStackTrace(); } } }
这一步不是必须的,可是建议引入
一、按住ctrl点击某个类
二、点击Attach Source
基于Dom4j的操做
获取类路径下的文件
File f = new File("books.xml"); //由于在不一样的包中,因此没法找到 System.out.println(f.exists()); /* * 要获取类路径下的文件能够经过类.class.getResource("文件名") */ URL url = Test02.class.getResource("books.xml"); //根据url获取完整的路径 System.out.println(url.getPath()); f = new File(url.getPath()); System.out.println(f.exists());
对于XML文档的基本访问
try { SAXReader reader = new SAXReader(); //获取xml包中的books.xml Document d = reader.read(TestXML03.class .getResourceAsStream("xml/books.xml")); //获取根元素 Element re = d.getRootElement(); System.out.println("root:"+re.getName()); //并非null,而是一组空字符串 System.out.println(re.elementText("book")); //获取root的全部子节点 List<Element> eles = re.elements(); for(Element ele:eles) { //System.out.println(ele.getName()); //获取属性为id的值 System.out.println(ele.attributeValue("id")); //获取某个特定子节点中的元素的文本值 System.out.println(ele.elementText("title")+":"+ele.elementText("price")); } } catch (DocumentException e) { e.printStackTrace(); }
基于XPath的访问
SAXReader reader = new SAXReader(); Document d = reader.read(TestXPath.class.getResource("xml/books.xml")); Element root = d.getRootElement(); /** * 相对路径查找,从当前节点查找子节点book */ List<Element> eles = root.selectNodes("book"); System.out.println(eles); /** * 使用绝对路径来查找,从根books节点查找book节点(此时不会去查找book下的子节点) */ eles = root.selectNodes("/books/book"); System.out.println(eles.size()+":"+eles); /** * 根节点不是book,因此没法查找 */ eles = root.selectNodes("/book"); System.out.println(eles.size()+":"+eles); /** * 表示从文档中遍历全部知足要求的节点(从根节点开始) * 不太建议使用,由于效率不高 */ eles = root.selectNodes("//title"); System.out.println(eles.size()+":"+eles); /** * 查找了全部做者为Bruce Eckel的书 */ //author:节点下的元素节点 eles = root.selectNodes("/books/book[author='Bruce Eckel']"); for(Element e:eles) { System.out.println(e.elementText("title")); } System.out.println("--------------------------------------------"); /** * 查找了属性中id大于等于2的书 */ //使用@能够遍历属性节点的值 eles = root.selectNodes("/books/book[@id>=2]"); for(Element e:eles) { System.out.println(e.elementText("title")); } /** * 查找名称中包含有java的price节点 */ // /price获得的是price节点而不是book节点 //contains(title,'java'):xpath的函数,第一个参数不加引号 //由于是xml中的节点名称,第二个加引号表示是一个比较的字符串 eles = root.selectNodes("/books/book[contains(title,'java')]/price"); for(Element e:eles) { System.out.println(e.getTextTrim()); } System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"); /** * 查找名称中包含有java而且价格小于50的书 */ eles = root.selectNodes("/books/book[contains(title,'java') and price<50]"); for(Element e:eles) { System.out.println(e.elementText("title")+":"+e.elementText("price")); }
向xml中写数据
一、建立Document
//写数据首先要建立一个document对象 Document d = DocumentHelper.createDocument();
二、添加元素
//为d添加节点,而且返回该节点 Element root = d.addElement("users"); //为根节点添加节点,而且返回添加的节点 Element eu = root.addElement("user"); //添加属性 eu.addAttribute("id", "1"); //添加username和password两个节点 eu.addElement("username").addText("张三"); eu.addElement("password").addText("123456"); eu = root.addElement("user"); eu.addAttribute("id", "2"); eu.addElement("username").addText("李四"); eu.addElement("password").addText("2222222");
三、建立XMLWriter
//获取xml文件所在的路径 String path = TestWrite2XML.class.getResource("xml/users.xml").getPath(); //在学习时可使用这种方法 //会默认修改bin下的文件,将路径从bin替换成src path = path.replace("bin", "src"); //建立XMLWriter来写数据 out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint());
四、经过XMLWriter写数据
//将节点写到xml文档中 out.write(d);
完整代码
XMLWriter out = null; try { //写数据首先要建立一个document对象 Document d = DocumentHelper.createDocument(); //为d添加节点,而且返回该节点 Element root = d.addElement("users"); //为根节点添加节点,而且返回添加的节点 Element eu = root.addElement("user"); //添加属性 eu.addAttribute("id", "1"); //添加username和password两个节点 eu.addElement("username").addText("张三"); eu.addElement("password").addText("123456"); eu = root.addElement("user"); eu.addAttribute("id", "2"); eu.addElement("username").addText("李四"); eu.addElement("password").addText("2222222"); //获取xml文件所在的路径 String path = TestWrite2XML.class.getResource("xml/users.xml").getPath(); //在学习时可使用这种方法 //会默认修改bin下的文件,将路径从bin替换成src path = path.replace("bin", "src"); //建立XMLWriter来写数据 out = new XMLWriter(new FileWriter(path),OutputFormat.createPrettyPrint()); //将节点写到xml文档中 out.write(d); } catch (IOException e) { e.printStackTrace(); } finally { //须要关闭XMLWriter try { if(out!=null) out.close(); } catch (IOException e) { e.printStackTrace(); }