• 用SAX方式解析XML(使用Dom4J工具)第二天


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

           解压后,打开docs/guide.html>点击Quick start(快速入门),可以查看主要功能使用方法,快速了解Dom4J的使用

    2、这里使用JUnit测试,需要导入Junit的Jar包,这个包在MyEclipse中自带有


    <?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>  
        <书 ISBN="abc">  
            <书名>Java就业培训教程</书名>  
            <作者>张孝详</作者>  
            <批发价>8元</批发价>  
            <售价>28.0元</售价>        
        </书>  
        <书 大小="猪肉">  
            <书名>JavaScript从入门到精通</书名>  
            <作者>戴振良</作者>  
            <售价>88.00元</售价>  
        </书>  
    </书架>


    package com.itheima.dom4j;
    
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Assert;
    import org.junit.Test;
    
    public class Dom4JCRUD {
    //	 1、得到某个具体的节点内容
    //	 得到 第一本书的主体内容
    	@Test
    	public void test1() throws Exception {
    		SAXReader reader = new SAXReader();// 得到SAX解析器
    		Document document = reader.read("src/book.xml");// 得到DOM树
    		Element root = document.getRootElement();// 得到根元素
    		Element firstBook = root.element("书");// 得到第一个书元素
    		Assert.assertEquals("王昭珽", firstBook.elementText("作者"));
    	}
    
    //	 2、遍历所有元素节点
    	@Test
    	public 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 e) {
    		System.out.println(e.getName());
    		for (int i = 0, size = e.nodeCount(); i < size; i++) {
    			Node n = e.node(i);
    			if (n instanceof Element) {
    				treeWalk((Element) n);// 递归
    			}
    		}
    	}
    
    //	 3、修改某个元素节点的主体内容
    //	 修改第二本书的售价为55元
    	@Test
    	public void test3() throws Exception {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		得到第2本书并修改主体内容
    		List<Element> list = root.elements();
    		Element secondBook = list.get(1);
    		Element price = secondBook.element("售价");
    		price.setText("55.00元");
    //		把DOM树写回XML文件
    		OutputStream out = new FileOutputStream("src/book.xml");
    		OutputFormat format = OutputFormat.createPrettyPrint();//创建美观的输出格式
    		XMLWriter writer = new XMLWriter(out, format);
    		writer.write(document);	//以format的格式将DOM树写到out中
    	}
    //	 4、向指定元素节点中增加子元素节点
    //		向第一本书增加<批发价>10.00元</批发价>
    	@Test
    	public void test4() throws Exception {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		1、得到第一本书
    		Element firstBook = root.element("书");
    //		2、增加<批发价>10.00元</批发价>
    		firstBook.addElement("批发价").setText("10.00元");
    //		3、写回DOM树
    		OutputStream out = new FileOutputStream("src/book.xml");
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		XMLWriter writer = new XMLWriter(out,format);
    		writer.write(document);
    	}
    //		5、向指定元素节点上增加同级元素节点
    //		在第1本书的售价前插入<内部价>20.00元</内部价>
    		@Test
    	public void test5() throws Exception {
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		1、获取第一本书的子元素的List
    		Element firstBook = root.element("书");
    		List<Element> list = firstBook.elements();
    //		2、创建一个元素<内部价>20.00元</内部价>
    		Element innerPrice = DocumentHelper.createElement("内部价").addText("10.00元");
    //		3、在List的索引1处插入一个<内部价>20.00元</内部价>元素
    		list.add(2, innerPrice);
    //		4、将DOM树写回XML文件
    //		为什么List不用增加到DOM树中去呢,因为List保存的只是一个引用,这些引用
    //		指向的是DOM树里的元素对象
    		OutputStream out = new FileOutputStream("src/book.xml");
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		XMLWriter writer = new XMLWriter(out,format);
    		writer.write(document);
    	}
    //		6、删除指定元素节点
    //		删除第1本书的批发价
    	@Test
    	public void test06() throws Exception{
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		1、获取第一本书的售价元素  
    		Element price = root.element("书").element("批发价");
    //		2、用它的父元素把它移除
    		price.getParent().remove(price);
    //		3、将DOM树写回XML文件
    		OutputStream out = new FileOutputStream("src/book.xml");
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		XMLWriter writer = new XMLWriter(out,format);
    		writer.write(document);
    	}
    //	 	7、操作XML文件属性
    //		获取第一本书的ISBN属性值
    	@Test
    	public void test07() throws Exception{
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		1、获取第一本书
    		Element book = root.element("书");
    //		2、获取它的ISBN属性值
    		String ISBN = book.attributeValue("ISBN");
    		Assert.assertEquals("abc", ISBN);
    	}
    //	 8、增加XML文件属性
    //	为第一本书的增加出版社属性:出版社="小马出版社"
    	@Test
    	public void test08() throws Exception{
    		SAXReader reader = new SAXReader();
    		Document document = reader.read("src/book.xml");
    		Element root = document.getRootElement();
    //		1、获取第一本书
    		Element book = root.element("书");
    //		2、增加出版社属性
    		book.addAttribute("出版社", "小马出版社");
    //		3、将DOM树写回XML文档
    		OutputStream out = new FileOutputStream("src/book.xml");
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		XMLWriter writer = new XMLWriter(out,format);
    		writer.write(document);
    	}
    }
    

    XPath
    在使用XPath时,除了需要导入Dom4J包里的dom4j-1.6.1.jar包还需要改Dom4Jlib目录下的jaxen-1.1-beta-6.jar

    Lib目录中的包是按需导入的。

    查看XPath的帮助文档,有中文的,非常容易理解的。

    想要对某个元素进行操作都必须得先得到该元素,上面例子中得到某个元素需要根据DOM树结构一层一层的去获取,很麻烦,通过XPath就能快速的得到想要的元素,DOM4J中支持XPath的方法有3个,如下:

          

     List list = document.selectNodes( "//foo/bar" );//获取多个节点
    
            Node node = document.selectSingleNode( "//foo/bar/author" );//获取单个节点
    
            String name = node.valueOf( "@name" );//获取属性值
    如上面例子中第text1可改为:

    //  1、得到某个具体的节点内容
    
    //  得到 第一本书的主体内容
    
    @Test
    
    public void test11() throws Exception {
    
    SAXReader reader = new SAXReader();// 得到SAX解析器
    
    Document document = reader.read("src/book.xml");// 得到DOM树
    
    String xpath = "//书[1]/作者";
    
    Node author = document.selectSingleNode(xpath);
    
    Assert.assertEquals("王昭珽", author.getText());
    
    }


    如上面例子中第text7可改为:

    //   7、操作XML文件属性
    
    // 获取第一本书的ISBN属性值
    
    @Test
    
    public void test071() throws Exception{
    
    SAXReader reader = new SAXReader();
    
    Document document = reader.read("src/book.xml");
    
    Element root = document.getRootElement();
    
    String xpath = "//书[1]";
    
    Node firstBook = document.selectSingleNode(xpath);
    
    xpath = "@ISBN";
    
    String ISBNValue = firstBook.valueOf(xpath);
    
    Assert.assertEquals("abc", ISBNValue);
    
    }


    选择所有属性为:ISBN="abc" 出版社="小马出版社" 的<书>元素

    @Test
    
    public void test9() throws Exception{
    
    SAXReader reader = new SAXReader();
    
    Document document = reader.read("src/book.xml");
    
    Element root = document.getRootElement();
    
    String xpath = "//书[@ISBN='abc' and @出版社='小马出版社']";
    
    Node book = document.selectSingleNode(xpath);
    
    Assert.assertEquals("书", book.getName());
    
    }



  • 相关阅读:
    python
    car-travel project
    数据库
    kafka笔记
    cloudera笔记
    上课笔记
    structured streaming
    SparkSQL
    流数据
    spark厦门大学
  • 原文地址:https://www.cnblogs.com/runwind/p/4454722.html
Copyright © 2020-2023  润新知