DOM方法
实现步骤:
1.创建DocumentBuilderFactory的对象
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
2.创建DocumentBuilder的对象
DocumentBuilder builder=builderFactory.newDocumentBuilder();
3.通过DocumentBuilder的parse方法加载xml文件,返回一个Document的对象
Document document=builder.parse("books.xml");
4.获取所需要解析的节点的集合 例如获取book节点
NodeList list=document.getElementsByTagName("book");
5.进行遍历这个节点的集合,进行解析属性以及子节点及其内容
一些常用方法如下:
解析属性
//获取一个book节点
Node book=list.item(i);
//获取book节点属性的集合
NamedNodeMap map=book.getAttributes();
//获取属性
Node node=map.item(j);
//获取属性名
String name=node.getNodeName();
//获取属性值
String value=node.getNodeValue();
解析子节点及其值
//获取book节点的子节点的集合
NodeList list2=book.getChildNodes();
for (int j = 0; j < list2.getLength(); j++) {
//判断节点是不是Element属性 因为空格也会算是一个节点
if (list2.item(j).getNodeType()==Node.ELEMENT_NODE) {
//获取子节点的name与value
System.out.print(list2.item(j).getNodeName());
//由于一个节点的开始与结尾标签中间默认是一个标签 故通过以下方法获取
System.out.println("-----"+list2.item(j).getFirstChild().getNodeValue()); }
获取Element节点值的方法还有
list2.item(i).getTextContent()
区别如下:
如果标签下还有一个标签
<name><lala>haha</lala>少年阿宾</name>
使用
list2.item(j).getFirstChild().getNodeValue()
方法时返回值为null 因为子节点为Element类型
用第二个节点则返回haha少年阿宾
代码:
//使用DOM方法解析xml
public class Dom {
public static void main(String[] args) {
//首先创建DocumentBuilderFactory的对象
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//创建DocumentBuilder的对象,需要try——catch
try {
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//通过DocumentBuilder的parse方法加载xml文件,返回一个Document的对象
Document document=builder.parse("books.xml");
//获取所有book节点的集合
NodeList list=document.getElementsByTagName("book");
System.out.println("共有"+list.getLength()+"本书");
//遍历每一本书
for(int i=0;i<list.getLength();i++) {
//获取一个book节点
Node book=list.item(i);
//获取book节点属性的集合
NamedNodeMap map=book.getAttributes();
System.out.println("第"+(i+1)+"本书共有"+map.getLength()+"个属性");
//遍历每个属性
for (int j = 0; j < map.getLength(); j++) {
//获取属性
Node node=map.item(j);
//获取属性名
String name=node.getNodeName();
System.out.print("属性名为"+name);
//获取属性值
String value=node.getNodeValue();
System.out.println("-----属性值为"+value);
}
//获取book节点的子节点的集合
NodeList list2=book.getChildNodes();
for (int j = 0; j < list2.getLength(); j++) {
//判断节点是不是Element属性 因为空格也会算是一个节点
if (list2.item(j).getNodeType()==Node.ELEMENT_NODE) {
//获取子节点的name与value
System.out.print(list2.item(j).getNodeName());
//由于一个节点的开始与结尾标签中间默认是一个标签 故通过以下方法获取
System.out.println("-----"+list2.item(j).getFirstChild().getNodeValue());
}
}
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>少年阿宾</name>
<year>2002</year>
<price>0.01元</price>
</book>
<book id="2">
<name>少妇白洁</name>
<year>1997</year>
<price>99元</price>
</book>
</bookstore>