您当前的位置: 首页 > 

蔚1

暂无认证

  • 2浏览

    0关注

    4753博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

XML操作,DOM4J及XPath工具使用

蔚1 发布时间:2020-05-18 23:31:22 ,浏览量:2

本 Chat 你将会获得以下知识:

  1. JAXP 进行 SAX 解析
  2. DOM4J 基本使用
  3. XPath 基本使用
  4. XML 约束之 Schema 约束
  5. 可以使用 SAX 方式读取 XML 以及使用 DOM4J,API 操作 XML
1 JAXP 进行 SAX 解析 1.1 核心 API 解读

SAXParserFactory: SAX 解析工厂实例,里面的 newInstance 方法得到工厂实例。SAXParse r: SAX 解析器对象。XMLReader: XML 读取器。ContentHandler: 事件处理器的接口。

1.2 开发步骤
1)使用 SAXParserFactory 创建 SAX 解析工厂SAXParserFactory spf = SAXParserFactory.newInstance();2)通过 SAX 解析工厂得到解析器对象        SAXParser sp = spf.newSAXParser();3)通过解析器对象得到一个 XML 的读取器XMLReader xmlReader = sp.getXMLReader();4)设置读取器的事件处理器        xmlReader.setContentHandler(new BookParserHandler());5)解析 xml 文件    xmlReader.parse("book.xml");
1.3 读取 XML 案例 文件清单:student.xml
            郭靖        男        30                黄蓉        女        20    
文件清单:主测试方法
@Testpublic void testRead() throws Exception, SAXException{        //1、创建 SAXParserFactory 实例        SAXParserFactory factory = SAXParserFactory.newInstance();        //2、通过 SAXParserFactory 的方法创建 SAXParser        SAXParser parser = factory.newSAXParser();        //3、通过 SAXParser 的方法创建 XML 读取器        XMLReader reader = parser.getXMLReader();        //4、设置事件处理器对象        reader.setContentHandler(new StudentHandler());        //5、解析 XML        reader.parse("src/student.xml");}
文件清单:事件处理器类
class StudentHandler extends DefaultHandler{    //开始文档    @Override    public void startDocument() throws SAXException {       }    //元素开始    @Override    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {        //打印开始元素        System.out.println("");    }       //遇到文本内容    @Override    public void characters(char[] ch, int start, int length)throws SAXException {        //重新组装文本内容        String cnt = new String(ch,start,length);        //排除空白内容        if(!cnt.trim().equals("")){            System.out.println(cnt);        }           }    //元素结束    @Override    public void endElement(String uri, String localName, String qName)throws SAXException {        //打印结束元素        System.out.println("");    }    //结束文档    @Override    public void endDocument() throws SAXException {    }}

注意:DefaultHandler 是 ContentHandler 接口的一个实例类,在实际编程中通常我们会直接继承 DefaultHandler,这样想实现 ContentHander 接口的哪些方法直接覆盖就可以了!

文件清单:输出结果
郭靖男30黄蓉女20
2 Dom4j 基本使用 2.1 DOM4J 概述
  • Dom4j 是一个简单、灵活的开放源代码的库。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。
  • Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j,例如 Hibernate,包括 sun 公司自己的 JAXM 也用了 Dom4j。
  • 使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。(http://www.dom4j.org/download.html)
2.2 DOM4J 核心接口解读

DOM4J 主要接口都在 org.dom4j 这个包里定义在这里插入图片描述Node为所有的 dom4j 中 XML 节点定义了多态行为;

-Branch为能够包含子节点的节点如 XML 元素(Element)和文档(Document)定义了一个公共的行为;|-Element 定义 XML 元素;|-Document 定义了 XML 文档;

-DocumentType 定义 XML DOCTYPE 声明;-Entity 定义 XML entity;-Attribute 定义了 XML 的属性;-ProcessingInstruction 定义 XML 处理指令;

-CharacterData 是一个标识接口,标识基于字符的节点。如 CDATA,Comment, Text;|- CDATA 定义了 XML CDATA 区域;|-Text 定义 XML 文本节点;|- Comment 定义了 XML 注释的行为;

2.3 CRUD 案例
            郭靖        男        25                黄蓉        女        20    

读取节点信息

读取所有元素信息

    @Test    public void testRead1() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //3、获得根元素        Element e = doc.getRootElement();        //4、遍历根元素下面所有子元素        praseChildElement(e);    }    //遍历指定元素下面的所有子元素    private void praseChildElement(Element e) {        System.out.println(e.getName());        //获取元素下面的所有子元素        List cList = e.elements();        for(Element c:cList){            praseChildElement(c);        }    }

读取指定元素内容

    @Test    public void testRead2() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //获得第一个学生节点        Element student = (Element) doc.getRootElement().elements("学生").get(0);        //获得第一个学生节点下的姓名节点        Element name = student.element("姓名");        //获得姓名节点的内容        System.out.println(name.getText());     }

读取属性

    @Test    public void testRead3() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //获得第一个学生节点        Element student = (Element) doc.getRootElement().elements("学生").get(0);        //读取第一个学生节点的学号属性        Attribute attr = student.attribute("学号");        //获得学号的名称和值        System.out.println(attr.getName()+"="+attr.getValue());    }

添加节点信息

@Test    public void testAdd1() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //获得第一个学生节点        Element student = (Element) doc.getRootElement().elements("学生").get(0);        //在学生节点下添加新的元素        Element newElement = student.addElement("师傅");        //设置元素内容        newElement.setText("江南七怪");        //将内存的 XML 数据写入到磁盘文件中        //注意:如果文档中含有中文,需要设置写入的编码格式        OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出        format.setEncoding("utf-8");//指定 XML 编码        //1、创建 XMLWriter 对象,指定写出的文件路径        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);        //2、调用 writer 方法将内存内容写出        writer.write(doc);        //3、关闭对象,释放资源        writer.close();    }

修改节点信息

@Test    public void testUpdate1() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //获得第一个学生节点        Element student = (Element) doc.getRootElement().elements("学生").get(0);        Element age = student.element("年龄");        //修改元素内容        age.setText("30");        //将内存的 XML 数据写入到磁盘文件中        //注意:如果文档中含有中文,需要设置写入的编码格式        OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出        format.setEncoding("utf-8");//指定 XML 编码        //1、创建 XMLWriter 对象,指定写出的文件路径        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);        //2、调用 writer 方法将内存内容写出        writer.write(doc);        //3、关闭对象,释放资源        writer.close();    }

删除节点信息

@Test    public void testDelete1() throws Exception{        //1、创建 SAXReader 实例        SAXReader reader = new SAXReader();        //2、通过 read 方法加载 XML 文档,并获得 Document 文档对象        Document doc = reader.read("src/student.xml");        //获得第一个学生节点        Element student = (Element) doc.getRootElement().elements("学生").get(0);        student.detach();//删除元素        //将内存的 XML 数据写入到磁盘文件中        //注意:如果文档中含有中文,需要设置写入的编码格式        OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的格式化输出        format.setEncoding("utf-8");//指定 XML 编码        //1、创建 XMLWriter 对象,指定写出的文件路径        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/student.xml")),format);        //2、调用 writer 方法将内存内容写出        writer.write(doc);        //3、关闭对象,释放资源        writer.close();    }
XPath 基本使用 3.1 XPath 语法简单入门

XPath 是一种表达式语言,XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。学习 XPath 是为了更快更好地选取我们想要选取的 XML 元素。

以下 XML 作为案例:

  Harry Potter  29.99  Learning XML  39.95

选取节点XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。则:

路径表达式结果bookstore选取 bookstore 元素的所有子节点/bookstore选取根元素 bookstore 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!bookstore/book选取所有属于 bookstore 的子元素的 book 元素。//book选取所有 book 子元素,而不管它们在文档中的位置。bookstore//book选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。//@lang选取所有名为 lang 的属性。

使用限定语用来查找某个特定的节点或者包含某个指定值的节点。以方括号[ ]括起。例如:

路径表达式结果/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。/bookstore/book[position()35.00]选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。/bookstore/book[price>35.00]/title选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。

使用通配符

通配符描述*匹配任何元素节点@*匹配任何属性节点node()匹配任何类型的节点|选取若干路径如: 路径表达式结果/bookstore/*选取 bookstore 元素的所有子节点//*选取文档中的所有元素//title[@*]选取所有带有属性的 title 元素。//book/title | //book/price选取所有 book 元素的 tilte 和 price 元素。//title | //price选取所有文档中的 title 和 price 元素。/bookstore/book/title | //price选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

使用运算符

运算符描述实例返回值|计算两个节点集//book | //cd返回所有带有 book 和 ck 元素的节点集+加法6 + 410-减法6 - 42*乘法6 * 424div除法8 div 42=等于price=9.80如果 price 是 9.80,则返回 true。 如果 price 是 9.90,则返回 fasle。!=不等于price!=9.80如果 price 是 9.90,则返回 true。 如果 price 是 9.98,则返回 fasle。=9.80如果 price 是 9.90,则返回 true。 如果 price 是 9.70,则返回 fasle。or或price=9.80 or price=9.70如果 price 是 9.80,则返回 true。 如果 price 是 9.50,则返回 fasle。and与price>9.00 and price

schemaLocation 此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。注意,在使用 schemaLocation 属性时,也需要指定该属性来自哪里。

使用默认名称空间基本格式: xmlns="URI"举例:

                
关注
打赏
1560489824
查看更多评论
0.0514s