dom4j解析原理 Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。 Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。 使用Dom4j开发,需下载dom4j相应的jar文件。
1、基本练习 a、拷贝jar包: 把dom4j-1.6.1.jar加入到你的classpath中 b、基本操作 // 1、得到某个具体的节点内容:金瓶梅 @Testpublic void test1() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); List<Element> bookElements = root.elements();// Element bookName = (Element) bookElements.get(0).elements().get(0);// System.out.println(bookName.getText()); System.out.println(bookElements.get(0).elementText("书名"));}// 2、遍历所有元素节点:名称 @Testpublic void test2()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); treeWalk(root);}public void treeWalk(Element rootElement){//递归 System.out.println(rootElement.getName()); int nodeCount = rootElement.nodeCount();//子节点的数量 for(int i=0;i<nodeCount;i++){ Node node = rootElement.node(i);//得到一个子节点 if(node instanceof Element){ treeWalk((Element)node); } }}// 3、修改某个元素节点的主体内容:<售价>10元---20 @Testpublic void test3()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); //得售价 Element priceElement = root.element("书").element("售价"); priceElement.setText("21元"); //写回XML文档// OutputFormat format = OutputFormat.createCompactFormat();//去除空格回车换行,适合运行期间 OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式 默认编码是UTF-8 XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format); writer.write(document); writer.close();}// 4、向指定元素节点中增加子元素节点:<出版社>黑马程序员 @Testpublic void test4()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); //得售价 Element bookElement = root.element("书"); //创建新元素 Element publisherElement = DocumentHelper.createElement("出版社"); publisherElement.setText("黑马程序员"); bookElement.add(publisherElement); //写回XML文档// OutputFormat format = OutputFormat.createCompactFormat();//去除空格回车换行,适合运行期间 OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式 默认编码是UTF-8 XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format); writer.write(document); writer.close();}// 5、向指定元素节点上增加同级元素节点:<售价>21元 添加<批发价> @Testpublic void test5()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); //得售价 Element bookElement = root.element("书"); //创建新元素 Element priceElement = DocumentHelper.createElement("批发价"); priceElement.setText("30元"); List<Element> bookChildren = bookElement.elements();//得到书的子元素 bookChildren.add(2, priceElement); //写回XML文档// OutputFormat format = OutputFormat.createCompactFormat();//去除空格回车换行,适合运行期间 OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式 默认编码是UTF-8 XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format); writer.write(document); writer.close();}// 6、删除指定元素节点:批发价 @Testpublic void test6()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); Element priceElement = root.element("书").element("批发价"); priceElement.getParent().remove(priceElement); //写回XML文档// OutputFormat format = OutputFormat.createCompactFormat();//去除空格回车换行,适合运行期间 OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式 默认编码是UTF-8 XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format); writer.write(document); writer.close();}// 7、操作XML文件属性 @Testpublic void test7()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); Element book = root.element("书"); System.out.println(book.attributeValue("ISBN"));}@Testpublic void test8()throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); //首先要得到根元素 Element root = document.getRootElement(); Element book = root.element("书"); book.addAttribute("A", "B"); //写回XML文档// OutputFormat format = OutputFormat.createCompactFormat();//去除空格回车换行,适合运行期间 OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式 默认编码是UTF-8 XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format); writer.write(document); writer.close();}XpathXPath是一个努力为XSL转换XSLT和XPointer [ ] [ ]之间共享一个共同的XPointer功能语法和语义的结果。它的主要目的是解决一个XML XML文档部分[ ]。为了支持这一功能,还提供用于处理字符串的基本设施、数字和布尔值。XPath使用一个紧凑的、非XML语法方便使用在uri和XML属性值的XPath。XPath操作基于XML文档的逻辑结构,而不是其表面的语法。Xpath的名字来自其使用的符号在URL路径通过一个XML文档的层次结构导航。 除了用于定位,XPath还设计有一个真子集,可用于匹配(测试一个节点是否符合一个模式);使用XPath进行XSLT。 XPath模型的XML文档的节点树。有不同类型的节点,包括元素节点、属性节点和文本节点。XPath定义了一个方法来计算每个节点类型字符串值。某些类型的节点也有名字。XPath完全支持XML命名空间的XML名称] [。因此,一个节点的名称被建模为一个地方的部分和一个可能的空命名空间URI;这就是所谓的扩展名。在[ 5数据模型]中详细描述了数据模型。 @Test//Xpathpublic void test11() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Node n = document.selectSingleNode("//书[1]/书名"); System.out.println(n.getText());}@Test//Xpath:第一本书的ISBN的值public void test12() throws Exception{ SAXReader reader = new SAXReader(); Document document = reader.read("src/book.xml"); Node n = document.selectSingleNode("//书[1]"); System.out.println(n.valueOf("@ISBN"));}
|