1、dom4j
Dom4j是一个易用的、开源的库,用于XML、XPath和XSLT。
它应用于Java平台,采用了Java集合框架并完全支持DOM、SAX和JAXP。
在Java开发社区里,DOM4J的使用最为广泛。
JDOM的操作非常简单,但是在处理大XML文件时性能表现不佳,解析10M文档时就会内存溢出。
而DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,DOM4J使用大量的接口,这也是它被认为比JDOM灵活的原因
接口 | 说明 |
---|---|
Attribute | 定义了XML的属性 |
CDATA | 定义了XML CDATA 区域 |
CharacterData | 标识基于字符的节点。如CDATA,Comment, Text. |
Comment | 定义了XML注释的行为 |
Document | 定义了XML文档 |
DocumentType | 定义XML DOCTYPE声明 |
Element | 定义XML 元素 |
ElementHandler | 定义了 Element 对象的处理器 |
Node | 为所有的dom4j中XML节点定义了多态行为 |
ProcessingInstruction | 定义 XML 处理指令 |
Text | 定义XML 文本节点 |
XPath | 在分析一个字符串后会提供一个XPath 表达式 |
Dom适用于
在结构上修改XML文档时。例如,以特定的顺序对元素进行排序或将某些元素从树中的一个位置移至另一个位置。
在内存中与其他应用程序共享文档时。
代码示例:
通过传入的对象集合创建对应的xml文件
/**
* 通过传入的对象集合创建xml文件
* @param objectList 对象列表
* @throws Exception
*/
private static void createX(List<?> objectList) throws Exception{
// TODO Auto-generated method stub
// 1.创建dom对象
Document document = DocumentHelper.createDocument();
// 2.创建根节点
Element rootElement = DocumentHelper.createElement("ListObject");
document.setRootElement(rootElement);
int size = objectList.size();
for (int i = 0;i<size;i++) {
//创建子节点
List<Element> elementList = createElements(objectList.get(i),rootElement);
//设置子节点值
setElementValue(objectList.get(i),elementList);
}
OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding("UTF-8");
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("F:\\包\\newbookStore.xml"), "UTF-8");
XMLWriter xmlWrite = new XMLWriter(writer,format);
xmlWrite.write(document);
xmlWrite.close();
}
/**
* 设置值
* @param o 对象
* @param elementList 节点列表
* @throws Exception
*/
private static void setElementValue(Object o, List<Element> elementList) throws Exception{
Field[] fields = o.getClass().getDeclaredFields();
int elength = elementList.size();
int flength = fields.length;
for (int i = 0; i < elength; i++) {
for (int j = 0; j < flength; j++) {
if(elementList.get(i).getQualifiedName().equals(fields[j].getName())) {
Field field = o.getClass().getDeclaredField(fields[j].getName());
field.setAccessible(true);
elementList.get(i).addText((String) field.get(o));
field.setAccessible(false);
}
}
}
}
/**
* 创建节点
* @param rootElement 根节点
* @return 返回节点列表
*/
private static List<Element> createElements(Object o,Element rootElement) {
Field[] fields = o.getClass().getDeclaredFields();
int length = fields.length;
List<Element> elementList = new ArrayList<Element>();
Element celement = rootElement.addElement(o.getClass().getSimpleName());
for (int i = 0; i < length; i++) {
Element element = celement.addElement(fields[i].getName());
elementList.add(element);
}
return elementList;
}
2、SAX
SAX是XML的简单应用程序编程接口。
SAX提供一种用于解析XML文档的事件驱动模型,在识别不同的XML语法结构时,SAX解析器使用回调机制来通知客户端应用程序,而不是将整个文档都存储在内存中。即使是处理大型文档也不会占用大量内存
优点:
- 在解析大型文档时,不必将整个文件加载到内存中,因此占用的内存比DOM少。
- 在只需一个信息子集时,SAX忽略不需要的数据,而DOM无法做到这一点。
缺点:
- 必须按到达顺序处理数据,不能对文档进行随机访问。
- SAX是只读的,它是设计用来读取XML文档而不是写入它们。
- 文档只能遍历一次。
代码示例:
private static void read() throws Exception{
// TODO Auto-generated method stub
//SAX文档解析工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//得到SAX解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//处理xml文件 真正的处理逻辑在XMLHandler
saxParser.parse("F://xml//bookStore.xml", new XMLHandler());
}
XMLHandler类
public class XMLHandler extends DefaultHandler{
/**
* 属性列表
*/
private Attributes attributes;
/**
* 值
*/
private String values;
/**
* 开始处理xml
*/
@Override
public void startDocument() throws SAXException {
System.out.println("开始处理");
}
/**
* 开始处理节点
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
this.attributes = attributes;
}
/**
* 处理节点,得到节点的值
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
this.values = new String(ch, start, length);
}
/**
* 节点处理完成
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
System.out.print("当前节点:"+qName);
int attLength = this.attributes.getLength();
if(null != this.attributes && attLength != 0) {
System.out.println(qName + "的属性:");
System.out.println();
for (int i = 0; i < attLength; i++) {
System.out.print(attributes.getQName(i) + ":" + attributes.getValue(i));
}
this.attributes = null;
}
if(null != this.values ) {
System.out.print( " 值:" + this.values);
this.values = null;
}else {
System.out.println();
}
System.out.println();
}
/**
* xml处理完成
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("处理完成");
}
}
更多代码示例:https://download.youkuaiyun.com/download/qq_39997210/11458571