XML的解析方式
SAX解析
事件驱动机制,逐行读取XML文件进行解析,当解析到标签的开始/结束/内容/属性时,
触发事件,可以编写程序在事件触发时,执行相应操作
优点
- 分析可以立刻开始,不需要等待加载
- 逐行加载,节省内存
- 不必解析整个文档,在某个条件得到满足时停止解析
缺点
- 单向解析,解析到第n行,n-1行的内容被当作内存垃圾回收了
- 解析到子标签时程序员无从得知它属于哪个父标签,需要自己写代码操作
- 只读解析,无法修改XML文件的内容
DOM解析
将整个XML文档加载到内存中并建立XML树模型,通过树模型可以对数据进行增删改查
优点
- 文档在内存中加载,可以对XML文件进行修改
- 双向解析,任何时候在树中双向解析数据
缺点
- 文档全部加载在内存中,消耗资源大
JDOM解析
优点
- 使用具体类而不是接口,简化了DOM解析的API
- 大量使用Java集合类,方便Java开发人员
缺点
- 灵活性差,因为不是面向接口编程
- 性能不优异
DOM4J解析
它是JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能
包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理
它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API
具有性能优异、功能强大和极端易用使用的特点
同时它也是一 个开放源代码的软件
如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML
XML的解析过程
//1、获取对应XML文档的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2、创建一个XML读对象
SAXReader sr = new SAXReader();
//3、读取XML数据,返回文档对象
Document doc = sr.read(is);
//4、获取根节点
Element root = doc.getRootElement();
//5、解析resultcode标签下的内容
String code = root.elementText("resultcode");
if("200".equals(code)){
//6、获取根节点下的result节点并解析内容
Element result = root.element("result");
String city = result.elementText("city");
System.out.println("该手机号码的归属地为:"+city);
}
XPath的解析过程
//1、获取对应XML文档的输入流
URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
//2、创建一个XML读对象
SAXReader sr = new SAXReader();
//3、读取XML数据,返回文档对象
Document doc = sr.read(is);
//4、XPath解析
Node node = doc.selectSingleNode("//company");
System.out.println(node.getText());
通过路径,直接获取XML树模型某节点下的内容,返回的数据类型为Node
XML的生成过程
//1、创建Document对象
Document doc = DocumentHelper.createDocument();
//2、设置节点
Element books = doc.addElement("books");
Element book = books.addElement("book");
Element name = book.addElement("name");
name.setText("aaa");
Element info = book.addElement("info");
info.setText("bbb");
//3、创建文件输出流
FileOutputStream fos = new FileOutputStream("D://books.xml");
//4、转化为XML输出流
XMLWriter xw = new XMLWriter(fos);
//5、写出文档
xw.write(doc);
xw.close();
//1、创建XStream对象
XStream x = new XStream();
//2、设置节点的名称,默认为包名.类名
x.alias("person",Person.class);
String xml = x.toXML(p);