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子节点的元素
阅读全文
0 0
- sax,Dom4j的CURD,xpath
- sax解析、dom4j解析、xpath
- XML--DTD--Schema--DOM--SAX--DOM4J--XPATH
- Dom4j加强&Xpath技术&SAX解析
- J2EE进阶之schema约束,JAXP的SAX解析,DOM4J的解析,XPATH的支持 七
- dom4j的XPATH语法
- dom4j xpath的使用
- dom4j下的XPATH
- css和javascript的一些笔记(六) schema sax dom4j xpath
- dom4j CURD
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Spring Cloud Eureka 入门 (三)服务消费者详解
- ORACLE 系统用户角色故障导致ORA-01017
- JS点击导航菜单选中效果
- Apache2在ubuntu下多端口设置
- 融云添加百度地图导航
- sax,Dom4j的CURD,xpath
- matlab画图的一些方法
- Android App中通过JNI调用C/C++代码
- remove-duplicates-from-sorted-array-ii
- 我就要找不同
- Netty编解码框架:Java序列化、Protobuf、 Marshalling
- MainActivity
- 【python Django】django入门教程1
- [PAT]1017. Queueing at Bank (25)@Java