xml是我们平常开发中,常见的文件格式,今天将学习他的解析方式。
四种解析方式:
- dom
- sax
- dom4j
- jdom
1、2两种方式是java官方提供的,而3、4两种则是需要jar包。
常用节点类型
Dom解析
xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>大力水手</name>
<author>六斤</author>
<year>2013</year>
<price>24</price>
</book>
<book id="2">
<name>童话</name>
<year>45</year>
<price>2012</price>
<language>中文</language>
</book>
</bookstore>
<!--
1. 首先看到最外层的根节点没有有用的信息
2. 形如<></>,都是一个标签对,<>为开始标签,</>为结束标签,也叫节点。
3. <book id = "3"></book>其中id是节点book的属性
4. <name>文本</name> 而文本将作为name的子节点
-->
解析代码
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//创建DocumentBuilderFactory对象
try {
DocumentBuilder db = dbf.newDocumentBuilder();//创建DocumentBuilder对象
Document d = db.parse("book.xml");//将xml文件加载到当前工程下。
NodeList booklist = d.getElementsByTagName("book");
System.out.println(booklist.getLength());//获取该标签的个数
for(int i=0;i<booklist.getLength();i++){
Node book = booklist.item(i);//注意索引值是从0开始。拿到指定的节点对象
NamedNodeMap nnm = book.getAttributes();//获取节点对象的属性map
for(int j=0;j<nnm.getLength();j++){//遍历属性
Node n = nnm.item(j);
System.out.println(n.getNodeName()+" "+n.getNodeValue());//获取属性的名称和值。
}
NodeList nl = book.getChildNodes();//book节点下的子节点集合
System.out.println(nl.getLength());
for(int i4=0;i4<nl.getLength();i4++){
Node d1 = nl.item(i4);
if(d1.getNodeType()==Node.ELEMENT_NODE){//保证获取的节点类型是Element类型
System.out.println(d1.getNodeName()+" "+d1.getFirstChild().getNodeValue());//注意这是的。getfirstChild节点类型就是text
}
}
/*Element book = (Element) booklist.item(i);//使用这个方法前提就是该节点下只能有一个属性名和属性值
String value = book.getAttribute("id");
System.out.println(value);*/
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
其中需要注意的地方
运行结果
这里需要注意的是,我们通过程序打印出子节点的个数,居然是9个。明明是4个,什么情况。这里就需要理解节点类型,java程序在默认把换行认为text类型节点,也算在其中,而我们需要的节点是attribute类型的节点
sax解析
xml文件同上
sax解析代码
SAXParserFactory factory = SAXParserFactory.newInstance();//获取SAXParserFactory的实例
try {
SAXParser parser = factory.newSAXParser();//获取SAXParser对象
Saxparserhander hander = new Saxparserhander();
parser.parse("book.xml", hander);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
package com.example.file;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class Saxparserhander extends DefaultHandler {
/*
* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
* 该方法用于表示解析开始标签
*/
@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes arg3) throws SAXException {
// TODO Auto-generated method stub
super.startElement(arg0, arg1, arg2, arg3);
if(arg2.equals("book")){
/*String value = arg3.getValue("id");//这种方法是已经标的属性名
System.out.println(value);*/
for(int i = 0;i<arg3.getLength();i++){//这是不知道属性名
System.out.println(arg3.getQName(i)+" "+arg3.getValue(i));//获取属性名属性值
}
}else if(!arg2.equals("book")&&!arg2.equals("bookstore")){
System.out.println(arg2);
}
}
/*
* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*该方法 表示解析结束标签
*/
@Override
public void endElement(String arg0, String arg1, String arg2)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(arg0, arg1, arg2);
}
/*
* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startDocument()
* 表示开始解析
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
/*
* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endDocument()
* 表示结束解析
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
// TODO Auto-generated method stub
super.characters(arg0, arg1, arg2);
String value = new String(arg0, arg1, arg2);
if(!value.trim().equals("")){
System.out.println(value);
}
}
}
jdom解析
首先先要导入jdom的jar。
导入jar包两种方式
- 右击项目名--build path--add external archives 点击进入下载的jar包的路径,进行添加。这种方式添加jar包缺点就是项目在导入导出的时候,jar会丢失。
- 在项目下建lib文件,将jar包复制到该文件下,然后右击项目名--build path--configure build path 添加,就不会出现导入导出项目,jar包丢失的问题
jdom解析代码
SAXBuilder builder = new SAXBuilder();//创建SAXBuilder对象
try {
InputStream in = new FileInputStream("book.xml");//将文件转成流
Document document = builder.build(in);//这里的document的对象是jdom包下
Element element = document.getRootElement();//获取根节点
List<Element> booklist = element.getChildren();//获取所有子节点集合
for(Element book:booklist){//遍历所有的节点集合
List<Attribute> attributelist = book.getAttributes();
for(Attribute bookattribute:attributelist){//遍历属性集合
System.out.println(bookattribute.getName()+" "+bookattribute.getValue());//获取属性的名和值
}
List<Element> subbook = book.getChildren();//获取book节点下的子节点集合
for(Element subbookattribute:subbook){
System.out.println(subbookattribute.getName()+" "+subbookattribute.getValue() );//获取子节点的属性名和值。
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dom4j
首先导入jar包。
dom4j代码
SAXReader reader = new SAXReader();//SAXReader实例
try {
Document document = reader.read(new File("book.xml"));//加载文件
Element bookstore = document.getRootElement();
Iterator<Element> it = bookstore.elementIterator();;
while(it.hasNext()){
Element book = it.next();//获取book节点
List<org.dom4j.Attribute> bookattrlist = book.attributes();//获取book节点的所有属性信息集合
for(org.dom4j.Attribute bookattr:bookattrlist){//遍历book节点下属性的信息
System.out.println(bookattr.getName()+" "+bookattr.getValue());//获取属性名和值
}
Iterator<Element> bookchilditerator = book.elementIterator();//获取book节点下的子节点集合
while(bookchilditerator.hasNext()){
Element bookchild = bookchilditerator.next();//获取每一个子节点
System.out.println(bookchild.getName()+" "+bookchild.getStringValue());//获取子节点的名和值。
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dom与sax优缺
总结
上面就是解析xml的四种解析方式,在我们平常使用中,我们常常要把解析出来的数据,包装成对象,方便我们的使用。