了解XML文件
xml表现:以.xml为文件扩展名的文件
xml文件的结构为树形结构
节点名区分大小写
在java程序中读取xml文件的过程称为解析xml文件
解析的目的:获取节点名、节点值、属性名、属性值。
通常使用四种解析方式:DOM、SAX、DOM4J、JDOM
解析xml文件的准备工作
1、创建一个DocumentBuilderFactory对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newinstance();
2、创建一个DocumentBuilder对象
DocumentBuilder db=dbf.newDoucumentBuilder();
3、通过DocumentBuilder对象的parse(String fileName)方法来解析xml文件
Document d=db.parse("url");//把XML文件加载到当前项目下
在java程序中如何获取xml文件的内容
通过上面的准备工作之后,我们把XML文件就加载到了项目中,然后我们可以通过Document.getElementsByTagName("TagName");方法来获取XML中节点的数据。这个方法会返回一个NodeList类型的值,直译过来就是一个节点集合。所以我们可以用NodeList来接受返回值
NodeList nl=Document.getElementsByTagName("TagName");
获取到了XML中的节点集合之后,可以通过getLength()方法来获取集合中的节点个数。同时可以用item(index);方法来获取集合当中的节点,这个方法会返回一个Node类型的值。
Node n=nl.item(index);
获取到了节点之后,我们可以通过getAttributes();方法来获取节点的属性值,它会返回一个NameNodeMap类型的集合,里面有节点所有的属性。
NamedNodeMap attrs=book.getAttributes();
然后通过item方法来获取attr中的属性,这个方法会返回一个Node类型的值,我们接收之后就可以通过调用 getNodeName以及getNodeValue两个方法来分别获取属性名以及属性值了。
除了获取节点的的属性之外,我们还可以获取节点的子节点。通过节点的getChildNodes函数,可以返回一个NodeList集合,里面有所有的子节点。需要注意的是子节点指的是节点中包含的所有数据,包括换行符。换行符会返回Test的值#test。在实际操作中,可以使用getNodeType函数来返回子节点的类型,从而来跳过换行符。
if(getNodeType()==Node.ELEMENT_NODE)
最后使用getNodeName函数可以获取到子节点的名字。如果还需要获得子节点的值,可以使用getTextContent函数,或者是使用getFirstChild先获取子节点的子节点,再使用getNodeValue函数来获取值。
完整的示例代码:
package com.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.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) throws IOException,SAXException,NullPointerException{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db=dbf.newDocumentBuilder();
Document d=db.parse("books.xml");
NodeList nl=d.getElementsByTagName("book");
System.out.println("集合节点的个数:"+nl.getLength());
for(int i=0;i<nl.getLength();i++){
Node book=nl.item(i);
NamedNodeMap attrs=book.getAttributes();
System.out.println("节点属性的个数:"+attrs.getLength());
for(int j=0;j<attrs.getLength();j++){
Node attr=attrs.item(j);
System.out.println("属性名:"+attr.getNodeName());
System.out.println("属性值:"+attr.getNodeValue());
}
NodeList chileList=book.getChildNodes();
for(int k=0;k<chileList.getLength();k++){
if(chileList.item(k).getNodeType()==Node.ELEMENT_NODE){
System.out.println(chileList.item(k).getNodeName());
System.out.println(chileList.item(k).getFirstChild().getNodeValue());
System.out.println(chileList.item(k).getTextContent());
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
用于测试的XML文件:
<?xml version="1.0" encoding="gb2312"?>
<bookstore>
<book id="1,2" num="123">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<year>2004</year>
<price>77</price>
<language>English</language>
</book>
</bookstore>