本 Chat 你将会获得以下知识:
- JAXP 进行 SAX 解析
- DOM4J 基本使用
- XPath 基本使用
- XML 约束之 Schema 约束
- 可以使用 SAX 方式读取 XML 以及使用 DOM4J,API 操作 XML
SAXParserFactory:
SAX 解析工厂实例,里面的 newInstance 方法得到工厂实例。SAXParse r:
SAX 解析器对象。XMLReader:
XML 读取器。ContentHandler:
事件处理器的接口。
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)
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 注释的行为;
郭靖 男 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"举例:
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?