使用JDOM来解析XML文件
JDOM是使用Java语言编写的、用于读、写、操作XML的一套组件。JDOM具有DOM修改文件的优点,JD和SAX读取快速的优点。
JDOM的主要操作类:
Document 定义了一个XML文件的各种操作,用户可以通过它所提供的方法来存取根元素。
Element 定义了一个XML元素的各种操作,用户可以通过它得到元素的文字内容,属性值和子节点。
Attribute XML文件元素中属性的各个操作。
XMLOutputter 将一个JDOM结构树格式化为一个XML文件,并且以输出流的方式加以输出。
实例:使用JDOM生成如下结构的xml
<?xml version="1.0" encoding="GBK" ?>
<QQInfo>
<info id="tsby">
<name>天水伯约</name>
<QQ>1031568262</QQ>
</info>
</QQInfo>
public static void main(String[] args) {
Element QQInfo = new Element("QQInfo");
Element info = new Element("info");
Element name = new Element("name");
Element QQ = new Element("QQ");
Attribute attr = new Attribute("id","tsby");
name.setText("天水伯约");
QQ.setText("1031568262");
info.addContent(name);
info.addContent(QQ);
info.setAttribute(attr);
QQInfo.setContent(info);
Document doc = new Document(QQInfo);
XMLOutputter out = new XMLOutputter();
out.setFormat(out.getFormat().setEncoding("GBK"));
try {
out.output(doc, new FileOutputStream("D:\\JDOM_QQInfo.xml"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
①通过上面代码,定义一个根节点QQInfo 然后定义节点info name QQ,定义个id属性,并初始化值。用过Element类的setText()方法设置节点name,QQ的内容。
②使用Element类的addContent()方法,将name节点、QQ节点做info的子节点。同样使用该方法,将info节点作为QQInfo的子节点。
③使用Document doc = new Document(QQInfo),创建一个QQInfo作为根节点的Document对象。
④XMLOutputter out = new XMLOutputter();创建XMLOutputter对象,用于输出XML文件。
out.setFormat(out.getFormat().setEncoding("GBK"));设置输出的编码格式
out.output(doc, new FileOutputStream("D:\\JDOM_QQInfo.xml"));输出XML文件到D盘的JDOM_QQInfo.xml文件中。
程序运行结果和预期的一样,D盘下生成JDOM_QQInfo.xml文件。
<?xml version="1.0" encoding="GBK"?>
<QQInfo><info id="tsby"><name>天水伯约</name><QQ>1031568262</QQ></info></QQInfo>
生成XML文件已经完成,接下来演示读取该XML文件并解析。
public static void main(String[] args) {
//使用JDOM读取本地文件解析
SAXBuilder build = new SAXBuilder();
Document doc = null;
try {
doc = build.build("D:\\JDOM_QQInfo.xml");
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element QQInfo = doc.getRootElement();
List<Element> list = QQInfo.getChildren("info");
for(int i=0;i<list.size();i++) {
Element info = list.get(i);
String name = info.getChildText("name");
String QQ = info.getChildText("QQ");
String id = info.getAttributeValue("id");
System.out.println("name:"+name+" QQ:"+QQ+" id:"+id);
}
}
运行结果为:
name:天水伯约 QQ:1031568262 id:tsby
从程序中可以看出,JDOM使用了SAX(simple APIs for XML)解析的方式来操作。
①首先建立一个SAXBuilder对象,用于构建Doc
SAXBuilder builder = new SAXBuilder()
②读取本地的XML文件并构建Document
Document doc = builder.build("D:\\JDOM_QQInfo.xml");
③利用Document对象的方法RootElement()得到XML的根元素
Element QQInfo = doc.getRootElement();
④有了这个根元素就可以通过getChildren()方法一次取得所有的info元素,在JDOM中所有的节点都是以集合的形式返回的,集合中每一个对象都是Element实例
List<Element> list = QQInfo.getChildren("info")
⑤遍历循环出每个Element,通过getChildText()取得节点的值,通过getAttributeValue()取得属性的值(或者getAttribute("id").getValue())