java解析xml方法:DOM,SAX,DOM4J,JDOM
本文介绍DOM方法解析xml文件
节点类型 | NodeType | NamedConstant | nodeName | nodeValue |
Element | ELEMENT_NODE | element name | null | |
Attr | ATTRIBUTE_NODE | 属性名 | 属性值 | |
Text | TEXT_NODE | #text | 节点内容 |
package com.imooc.dom.test;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomTest {
public static void main(String[] args) {
//创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
//创建一个DocumentBuilder对象
db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parse方法加载xml文件到当前项目下
Document document=db.parse("book.xml");
//获取所有book结点集合
NodeList bookList=document.getElementsByTagName("book");
//通过NodeList的getLength()方法获取bookList的长度
System.out.println("一共有"+bookList.getLength()+"本书");
//遍历每一个book结点
for(int i=0;i<bookList.getLength();i++){
System.out.println("=========下面开始遍历第"+(i+1)+"本书的内容=========");
//通过item(index)方法获取一个book结点,NodeList的索引值从0开始
Node book=bookList.item(i);
//获得book结点的所有属性集合
NamedNodeMap attrs=book.getAttributes();
System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性");
//遍历book的属性
for(int j=0;j<attrs.getLength();j++){
//通过item(index)方法获取book结点的某个属性
Node attr=attrs.item(j);
//获取属性名
System.out.print("属性名:"+attr.getNodeName());
//获取属性值
System.out.println("--属性值:"+attr.getNodeValue());
}
// //前提:若已知book只有一个id属性
// //将book结点强制类型转换成Element
// Element book=(Element) bookList.item(i);
// //通过getAttribute("id")方法获得属性值
// String attValue=book.getAttribute("id");
// System.out.println("id的属性值为:"+attValue);
//解析book结点的子节点
NodeList childNodes=book.getChildNodes();
System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
//遍历childNodes获取每个子节点的结点名和结点值
for(int k=0;k<childNodes.getLength();k++){
//区分element类型和text类型的Node
Node child=childNodes.item(k);
if(child.getNodeType()==Node.ELEMENT_NODE){
//获取element类型的结点名
System.out.print("第"+(k+1)+"个结点名:"+child.getNodeName());
//获取element类型的结点值,冰与火之歌看成是name的子节点
// System.out.println("--节点值是:"+child.getFirstChild().getNodeValue());
System.out.println("--节点值是:"+child.getFirstChild().getTextContent());
}
}
System.out.println();
System.out.println("=========结束遍历第"+(i+1)+"本书的内容=========");
}
} 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();
}
}
}