JDOM和DOM4J方式是非JAVA官方提供的,需要另外下载jar包,下载地址分别为:
JDOM : http://www.jdom.org/downloads/
DOM4J : http://dom4j.github.io/
2.3 应用JDOM方式解析XML
2.3.1 准备工作
通过new获取SAXBuilder对象:
SAXBuilder saxbuilder = new SAXBuilder();
使用SAXBuilder下的build()方法解析XML,build方法的参数可以直接是一个XML文件路径,也可以是一个InputStream,使用InputStream的实现类来解析XML文件,然后将输入流加载到saxBuilder中,build()方法将返回一个Document变量:
InputStream in = new FileInputStream("students.xml"); Document document = saxbuilder.build(in);
根据Document中的getRootElement()方法获取XML文件中的根元素(返回类型为Element),进而通过getChildren()获取它的子元素的集合List;
Element rootElem = document.getRootElement(); List<Element> childElemList = rootElem.getChildren();
备注:
1. 注意InputStream和build()会抛出异常;
2. Document和SAXBuilder等均来自org.jdom2包,下同;
2.3.2 解析元素的属性和子元素
在上一节获取到了XML中的根元素Element和子元素集合List,遍历每一个元素的方式不再赘述;
for(Element child : childElemList){ ……; }
对于每一个元素,通过getAttributes()方法获取每个元素的属性集合List,对于每个属性通过getName()和getValue()方法获取属性名和属性值:
List<Attribute> attrList = child.getAttributes(); for(Attribute attr : attrList){ System.out.println(attr.getName()+","+attr.getValue()); }
如果想要获取某个元素给定的属性可以直接使用getAttribute(String AttributeName);
获取元素的子元素和上述相同,使用getChildren()方法得到一个子元素集合List。
备注:
1. 与之前不同的是:无论什么类型的元素,getName()得到的都是元素的名称,getValue()得到的都是元素内的文本,不会保留空格和回车组成的文本,都是有实际值的文本;
2.3.3 JDOM解析时乱码问题的处理
当发现解析出来的XML文件出现乱码时,可以进行下述检查和修改:
查看XML文件中声明处的编码方式,可以修改为和文本兼容的编码方式,如UTF-8等;
不修改编码方式,可以对代码进行修改,在build()方法中不传递FileInputStream类型的参数,改为InputStreamReader,该类可以接收指定的编码方式:
FileInputStream in = new FileInputStream("students.xml"); InputStreamReader isr = new InputStreamReader(in,"UTF-8"); Document document = new Document(isr);
其实道理和第一种相同.
备注:
1.SAXBuilder,Document,Element和Attribute均来自org.jdom2包。
2.4 使用DOM4J解析XML
创建一个SAXReader的对象:
SAXReader saxreader = new SAXReader();
通过SAXReader的read()方法加载book.xml文件,获取Document对象,read()方法不可以通过直接传文件路径的方式加载XML文件,可以通过传递File对象作为参数来加载XML:
Document document = saxreader.read(new File("students.xml"));
同样通过document对象的getRootElement()方法获取xml的Element类型的根元素,Element类下有elementIterator()方法用于获取子元素,返回一个元素的迭代器:
Element school = document.getRootElement(); Iterator it = school.elementIterator();
遍历迭代器获取元素中的信息,根据迭代器中的hasNext()判断是否还有需要的元素,通过next()方法遍历每个元素,通过attributes()方法得到元素属性的集合List,通过Element(或Attribute)的getName()方法获取元素名(或属性名),通过getStringValue()得到元素包含的文本内容,通过getValue()得到属性值:
while(it.hasNext()){ Element student = (Element)it.next(); List<Attribute> attrList = student.attributes(); for(Attribute attr : attrList){ System.out.println(attr.getName()+","+attr.getValue()); } }
- 同样的可以继续通过elementIterator()方法获取子元素的迭代器。
备注:
1. 注意捕获异常;
2. 迭代器中的next()方法返回的是Object类型,需类型转换为Element;
3. Attribute、Document、Element和SAXReader类均来自org.dom4j包。
3 四种解析方式的比较
- 基础方式:DOM和SAX,不需要导入jar包
- DOM方式与平台无关,不仅仅是java平台有,其他许多平台也有;
- SAX方式是基于事件驱动的解析方式,适用于处理数据流,即随着数据的流动而依次处理数据
- 扩展方式:JDOM和 DOM4J,在基础的方法上的扩展,只有java中能使用的解析方式。
3.1 DOM方式
一次性的将xml中所有的内容加载进内存中,并形成一个DOM树,当xml比较大的时候,会浪费时间.
- 优点
- 形成了树结构,直观好理解,代码更易编写
- 解析过程中树结构保留在内存中,便于修改
- 缺点
- 当XML文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出
3.2 SAX方式
当使用SAX对XML文档解析时,会触发一系列事件,激活相应的事件处理方法(如:startDocument()和endDocument()方法在xml开始和结束时调用,startElement()和endElement()方法在每个元素解析和结束时调用等),应用程序通过这些事件处理函数实现对XML文档的访问。
- 优点
- 采用事件驱动模式,对内存消耗比较少
- 适用于只需要处理xml中数据时,不需要知道XMl文件中的结构
- 缺点
- 不易编码,如将XML内容转化为对应的类实例时较其他方式不易编码
- 由于事件触发的时序性,分析过的内容不能再倒回去重新处理
3.3 JDOM方式
- 仅使用具体类而不是用接口
- API大量使用Collections类,便于操作
3.4 DOM4J方式
- JDOM的一种智能分支,它合并了许多超出XML文档表示的功能
- DOM4J使用接口和抽象基本类方法
- 性能优异、灵活性好,功能强大和极易使用
- 开放源代码软件
不断学习不断总结^_^。。。