XML基础----dom4j x-path SAX
xml的作用:
1.描述带关系的数据结构(作为软件的配置文件)
2.用于装载数据(作为小型的数据库)
xml语法:
标签:标签名命名规则。一个xml文件有且仅有一个根标签!!!
属性:必须带引号(双引号或者单引号),不能省略引号或不写引号。一个标签内不能出现同名的属 性
文档声明:
version:xml版本号 encoding: 浏览器解析xml时使用的编码
<?xml version="1.0" encoding="UTF-8"?>
xml文件中文乱码问题:
1.保存xml文件时的编码(另存为)
2.浏览器解析xml时使用的编码(<?xml encoding="utf-8"?>)
以上两个编码必须保持一致!!
XML解析流行解析方式分为DOM4J解析与SAX解析.
使用dom4j
//参数一:指定xml文件的输出位置 OutputStream out = new FileOutputStream("e:/employee2.xml"); //参数二:指定xml文件的输出格式 //OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式。去掉空格和换行。给程序上线运行时使用 OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式。包含空格和换行。给开发者调式时使用 // 指定输出的编码 /** * 这个设置同时影响了 1)文档声明的encoding属性值 2)xml文件保存的编码 * 使用这个方法生成的xml文件,不会存在中文乱码问题!!! * */ format.setEncoding("utf-8"); //1.创建写出对象 XMLWriter writer = new XMLWriter(out,format); //2.写出 writer.write(doc); //3、关闭 writer.close();
获取标签信息
element("标签名"): 获取指定名称的第一个子标签对象
elements(): 获取所有的子标签对象,返回List
elementIterator(): 获取所有的子标签对象,返回Iterator
elements("标签名"): 获取指定名称的所有子标签对象
2)获取属性
attributeValue("属性名") : 根据属性名获取当前标签的属性值
attribute("属性名") :获取指定名称的属性对象,返回Attribute对象
getName(): 属性名 getValue(): 属性值
attributes(); 获取当前标签的所有属性对象,返回List
3)获取文本
getText(): 获取当前标签的文本
elementText("标签名"): 获取子标签的指定名称的文本
XPath技术
简介
问题:如果需要选取的节点的层次结构非常深,我们之间通过dom4j去读取这些标签非常麻烦!!
那么如果解决选取层次结构复杂的节点呢? 这就用到了XPath技术!!
XPath技术是一门快速查询(选取)节点的技术!!
dom4j如何使用XPath
1.导入xpath的支持
jaxen-1.1-beta-6.jar
2.使用方法
List list = selectNodes("xpath表达式") 选择符合条件的多个节点对象
Element/Attribute/Text node = selectSingleNode("xpath表达式") 选择符合条件的一个节点对 象
XPath表达式语法
/ 绝对路径 第一位:代表根标签 后面: 子元素
// 代表选择后代元素(不管层次结构)
* 通配所有标签
[] 带条件选择元素
@ 选取属性
text() 选择文本对象
SAX解析工具
Sun公司官方的SAX解析工具。内置在jdk中。org.xml.sax.*
SAX解析工具使用
1)无需导包
2)编码
2.1 创建SAXParser对象
2.2 parse ( new File("xml文件"), DefulatHandler的子类 )方法: 解析xml文件
DefulatHandler类: SAX解析的事件处理程序类,其中定义的读取XML文档的内容的相关事件触发操作。
startDocument() 加载到文件的开始调用次方法(1次)
startElement() 加载开始标签调用次方法(可能n次)
characters(): 加载文本内容调用次方法(可能n次)
endElement() 加载到结束标签调用次方法(可能n次)
endDocument() 加载文件的结束位置调用次方法(1次)
================= DOM解析 VS SAX解析 ========
DOM SAX
原理:一次性加载进内存,占用内容比较大, 加载一点,读取一点,处理一点,释放内存。对内存
不适合读取大容量的文件 要求比较小
DOM解析可以读取或修改xml文件 SAX只能读取xml文件
DOM解析可以任意来回读取xml文件 SAX是从上往下依次读取,不能往回读
DOM解析面向对象的编程,java开发者来说 基于事件的编程方式,编程方式比较难理解。
比较容易理解