XML解析方式
1.DOM解析
2.SAX解析
3.JDOM解析
4.DOM4J解析
1.2种是基础方法,官方提供,无关平台,3.4种属于扩展方法,只适用于Java平台。
DOM解析
DOM(Document Object Model)文档对象模型,将XML文件映射成一个倒挂的树
步骤
-创建解析器工厂对象
-由解析器工厂对象创建解析器对象
-由解析器对象对指定XML文件进行解析,构建DOM树,创建Document
-以Doucument对象为起点对DOM树的节点进行增删改操作
核心代码
// 1、得到DOM解析器的工厂实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 2、从DOM工厂获得DOM解析器
DocumentBuilder db = dbf.newDocumentBuilder();
// 3、解析XML文档,得到一个Document,即DOM树
Document doc = db
.parse("src\\xxx.xml");
// 4、得到所有<xxx>节点列表信息
NodeList xxxList = doc.getElementsByTagName("xxx");
System.out.println("xml文档中共有" + xxxList.getLength() + "条信息");
// 5、轮循xxx对象信息
for (int i = 0; i < xxxList.getLength(); i++) {
// Xxx newXxx = new Xxx();
// 5.1、获取第i个xxx元素信息
Node xxx = xxxList.item(i);
// 5.2、获取第i个xxx元素的id属性的值并输出
Element element = (Element) dog;
String attrValue = element.getAttribute("id");
// newXxx.setId(attrValue);
System.out.println("id:" + attrValue);
// 5.3、获取第i个xxx元素的所有子元素的名称和值并输出
for (Node node =xxx.getFirstChild(); node != null; node = node
.getNextSibling()) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
String name = node.getNodeName();// name
String value = node.getFirstChild().getNodeValue();// YAYA
System.out.print(name + ":" + value + "\t");
/*
* if("name".equals(name)) { newXxx.setName(value); }
*
* if("health".equals(name)) { newXxx.setHealth(value);
* } ..
*/
}
}
System.out.println();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
SAX解析
是Sun公司提供的,内置JDK中。org.xml.sax.*
解析基于事件的编程方法,解析速度快,不需要直接读入整个文档。
核心代码
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//编写DefaultHandler
public class MyDefaultHandler extends DefaultHandler {
/*
* 开始文档时调用
* */
@Override
public void startDocument() throws SAXException {
System.out.println("--开始文档了--");
}
/*
* 开始标签时调用
* @param qName:表示开始标签的标签名
* @param attributes:表示开始标签内的包含的属性列表
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("--开始标签"+"-------->"+qName);
}
/*
* 结束标签时调用
* @param qName:结束标签的标签名
* */
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("--结束标签"+"----->"+qName);
}
/*
*读到文本内容时调用
* @param ch:表示当前读取到的所有文本内容
* @param start:表示当前文本内容的开始位置
* @param length:表示当前文本内容长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//把获取文本内容转为字符串
String content=new String(ch,start,length);
System.out.println("获取文本内容"+"----->"+content);
}
/*
* 结束文档时调用
* */
@Override
public void endDocument() throws SAXException {
System.out.println("--结束文档 !--");
}
}
//测试类
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class MainClass {
public static void main(String[] args) throws Exception, SAXException {
//1.创建SAXParser对象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
//2.调用parser方法
/*
* 参数一:xml文档
* 参数二:DefaultHandler的子类
* */
DefaultHandler handler = new MyDefaultHandler();
parser.parse(new File("src/xxx.xml"),handler);
}
}
DOM与SAX的优缺点
dom解析: 优点:简单易学,可以对文档进行修改,如删除节点,增加节点等,灵活性较高,读取速度快,缺点:解析时,把整个xml文档读到内存中,占用较多资源。
sax解析: 优点:解析速度快,不需要直接读入整个文档,缺点:需要自己编写事件逻辑,使用麻烦,并且不能同时访问文档中的不同部分.使用范围:对于较大的文档有较好的解析能力,所以适用大文档的解析。
DOM4J解析
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
核心代码
// 默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针
InputStream inStream = MainClass.class
.getClassLoader().getResourceAsStream("xxx.xml");
SAXReader saxReader = new SAXReader();// 1. 创建sax解析器
org.dom4j.Document doc = saxReader.read(inStream);
// 2. 获得org.dom4j.Document文档对象
Element ele = doc.getRootElement();// 3.获得根节点
// 4.使用迭代器对根节点下的子节点进行迭代
Iterator<Element> it = ele.elementIterator();
while (it.hasNext()) {
// 取出当前的迭代的元素
Element Ele = it.next();
if("xxxs".equals(Ele.getName())){
//获取xxxs元素下边的所有xxx,并使用迭代器进行遍历
Iterator<Element> xxxIt = xxxEle.elementIterator();
while(xxxIt.hasNext()){
Element xxx=xxxIt.next();
Attribute att=xxx.attribute("id"); //获取节点属性值
System.out.println("id为"+att.getValue()+"的xxx名称是:"+dog.element("name").getText());
}
}
}
DOM4J除了解析XML,还可以对XML元素进行增加,删除和更新。具体是调用Element的方法进行操作。例如删除一个id为1003的元素。
for (Element element : elements) {
String id = element.attributeValue("id");
if ("1003".equals(id)) {
// 删除自己:自杀的权利
element.getParent().remove(element);
}
// 更新XML
// 1 构建输出格式(设置缩进格式,设置添加是否换行)
//OutputFormat compactFormat = OutputFormat.createCompactFormat(); //紧凑的格式
OutputFormat prettyFormat = OutputFormat.createPrettyPrint(); //漂亮的格式
// 2 构建XmlWriter
XMLWriter writer = new XMLWriter(new FileOutputStream("xxxs.xml"), format);
// 3 通过XmlWriter写出文档(从内存中写到磁盘)
writer.write(doc);
使用Dom4j需要导入Dom4j的jar包。