sax,Dom4j的CURD,xpath

来源:互联网 发布:程序员开发网 编辑:程序博客网 时间:2024/05/22 15:48

SAX解析 jaxp dom


DOM解析 读取整个XML文档,在内存中架构代表整个DOM树的Document对象

再对XML文档进行操作
XML文档特别大,会消耗大量内存,容易导致内存溢出

SAX解析
允许边读取边操作
采用事件处理的方式解析XML文档:解析器和事件处理器

1.用JAXP的API创建SAX解析器

指定解析器去解析某个XML文件

2.只要解析到XML文档的一个组成部分,都会调用事件处理器的一个方法

解析器调用方法时,会把当前解析到的XML文件内容
作为方法的参数传递给事件处理器

3.事件处理器由程序员编写,决定如何对传过来的数据进行处理



//1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();

//2.得到解析器
SAXParser sp = factory.newSAXParser();

//3.得到读取器
XMLReader reader = sp.getXMLReader();

//4.设置内容处理器
reader.setContentHandler(handler);//内容处理器由程序员重写 来决定如何处理内容
传入的handler是重写方法的类的对象

//5.读取xml文档内容
reader.parse("src/book.xml");//xml文档地址

SAX解析案例 javabean封装xml文档数据
startElement(String uri,String localName,String name)找头标签
characters(char[],int start,int length)内容处理
endElement(String uri,String localName,String name)找尾标签
断点跟踪SAX解析案例 分析程序问题


XML约束
XML DTD(Document Type Definition)文档类型定义
XML Schema

XML解析技术概述
dom:(Document Object Model文档对象模型)W3C推荐
dom解析为对象树 节点都解析为对象
缺点:占用内存大
优点:对文档CURD容易
sax:(Simple API for XML)不是官方标准 但几乎所有XML解析器都支持
读一行解析一行
优点:占用内存小 解析速度快
缺点:只适合读取 不适合CURD

XML解析开发包
Jaxp(sun) Jdom dom4j(最优)


DOM4j解析XML文档

Dom4j是一个简单,灵活的开放源代码的库由开发JDOM的人分离出来独立开发的
Dom4j使用接口和抽象基类,API相对复杂一些
但是提供了更好的灵活性

Hibernate JAXM(sun)都用的Dom4j(优秀的Java XML API)

使用Dom4j开发,需要下载dom4j相应的jar文件(找不到类找支持jar包)

reader:

SAXReader reader = new SAXReader();//获得读取器
Document document = reader.read(new File("src/book.xml"));//读取到文档
Element root = document.getRootElement();//只能从根节点获取开始
Element book = (Element)root.elements("书").get(1);//获得根节点下标签为书的第二本
String value = book.element("书名").getText();
//获得书下标签书名的内容 获取name属性(这里属性用对象封装)的值为.attributeValue("name")

add:

SAXReader reader = new SAXReader();//获得读取器

Document document = reader.read(new File("src/book.xml"));//读取到文档

Element book = document.getRootElement().element("书");//获取第一本书
book.addElement("售价").setText("199.00元");//添加<售价>199.00元</售价>在书最后

[//插入指定位置
List list = book.elements();//获得所有子元素list集合接受
Element price = DocumentHelper.creatElement("售价");
price.setText("199.00元");
list.add(2,price);//list的index从0开始,在第三个位置添加price]

//写到XML文档中
XMLWriter writer = new XMLWriter(new FileWriter("src/book.xml"));//重写XML文档
writer.write(document);
writer.close();//关闭

保存数据的乱码问题

FileWriter()默认用GB2312查询并写入文档,XML用UTF-8解码显示
用OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8")可以指定编码方式
XML为GB2312读入内存document也为UTF-8,指定码表要格式化输出器

OutputFormat format = OutputFormat.creatPrettyPrint();

format.setEncoding("gb2312");//设置好码表

XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"),format);
//用字节流,字符流写底层 写document不会查码表 如FileWriter()会默认gb2312
writer.write(document);
writer.close();

delete:

SAXReader reader = new SAXReader();//获得读取器
Document document = reader.read(new File("src/book.xml"));//读取到文档
Element price = document.getRootElement().element("书").element("售价");
//获取第一本书的第一个售价
price.getParent().remove(price);//删除

update:

SAXReader reader = new SAXReader();//获得读取器
Document document = reader.read(new File("src/book.xml"));//读取到文档
Element book = document.getRootElements().element("书").get(1);//获得第二本书

book.element("作者").setText("ppp");//子元素作者内容改为ppp


xpath提取xml文档数据

/AAA 要从跟节点开始 根节点AAA
//AAA 文档中所有的AAA节点
//* 所有节点
/AAA/BBB[1]
/AAA/BBB[last()]
//@id 所有具有id属性的元素
//BBB@id
//BBB[not(@*)]没有属性的BBB元素
//BBB[@id='b1']id属性为b1的BBB元素
//BBB[normalize-space(@name)='bbb']去掉空格name属性为bbb的BBB元素
//*[count(BBB)=2]所有含有2个BBB子节点的元素

原创粉丝点击