要进行解析的xml文件对象:
<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<author>安徒生</author>
<year>2017</year>
<price>77</price>
<language>Chinese</language>
</book>
</bookstore>
源代码:
import java.io.IOException;
import java.util.ArrayList;
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 {
//以dom方式来对所创建的xml文件进行解析操作
public static void main(String[] args) {
ArrayList<Book> bookEmptyList=new ArrayList<Book>(); //建立一个book集合对象用于将对book标签对象当中所解析而成的bookEmpty实例化对象进行保存操作
Book bookEmpty=null;//建立一个book实体类的对象用于对从xml文件对象当中所解析出来的book标签对象当中的数据信息进行保存操作
//1:实例化一个doucmentBuilderFactory实例化对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2:创建一个documentBuilder对象
try {
DocumentBuilder db=dbf.newDocumentBuilder();
//3:通过documentBuilder对象来对xml文件对象进行解析操作
Document document=db.parse("xml文件/books.xml");//对xml文件进行解析之后返回一个document(w3c)对象
NodeList bookList=document.getElementsByTagName("book");//获取xml文件对象当中的全部book标签对象并以节点集合的形式来进行返回操作
System.out.println("一共有"+bookList.getLength()+"本书。");
//对book标签节点集合对象进行遍历操作
for(int i=0;i<bookList.getLength();i++)
{
System.out.println("=============================下面开始遍历第"+(i+1)+"本书的内容。=======================================");
bookEmpty=new Book();//开始对当前book标签进行解析操作时,建立一个与之相对应的book实体类实例化对象用于对所解析出来的数据信息值进行保存
Node book=bookList.item(i);//对集合数组对象当中的元素开始进行遍历操作,获取节点集合当中的节点对象
NamedNodeMap attrs=book.getAttributes();//获取当前节点对象当中的全部的属性值对象并将其存放到map集合对象当中去
//对当前节点当中的全部属性值进行遍历操作
System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性");
for(int j=0;j<attrs.getLength();j++)
{
Node attr=attrs.item(j);//获取属性集合对象当中的第i个属性节点对象
System.out.print("属性名:"+attr.getNodeName());//对当前节点的名字进行输出操作
System.out.println("---属性值:"+attr.getNodeValue());//对当前节点的属性有效值进行输出操作
if(attr.getNodeName().equals("id"))
{//表明当前解析到了book标签当中的id属性值对象
bookEmpty.setId(attr.getNodeValue());//将当前所解析到的id属性值存放到book实例化对象当中
}
}
//下面这种方式来对book标签对象当中的属性值进行输出的前提是知道了book标签对象当中只有一个属性对象为ID
// Element book=(Element)bookList.item(i);//获取book集合对象当中的第i个book对象并将其进行强制转换类型操作
// String attrValue=book.getAttribute("id");
// System.out.println("属性名id:---"+attrValue);
// System.out.println("==============================结束对第"+(i+1)+"本书的遍历操作。=========================================\n");
//4:当对book标签节点解析完毕之后将开始对其子节点进行解析操作
NodeList childNode=book.getChildNodes();//得到当前book节点的全部子节点对象,并且以一个节点集合的形式来进行返回操作
//遍历book节点的全部子节点对象
System.out.println("第"+(i+1)+"本书当中共有"+childNode.getLength()+"个子节点.");//此时会显示有9个子节点,但是在xml文档当中可以看到只有四个子节点,是因为系
//统会自动的将book标签于子节点,子节点和字节点之间的空格+换行看做是一个节点
//对book标签当中的子节点进行遍历输出操作
for(int k=0;k<childNode.getLength();k++)
{//对子节点集合当中的第k项子节点对象的名字进行输出操作
//System.out.println(childNode.item(k).getNodeName());//在所输出的子节点名称当中#text代表的就是空白节点对象
if(childNode.item(k).getNodeType()==Node.ELEMENT_NODE)
{//只对含有标签对象的元素节点进行输出操作,对为空白的文本对象节点(#text)不进行输出操作
System.out.print("第"+(k+1)+"个节点的节点名:"+childNode.item(k).getNodeName());//获取子节点对象的节点名字
//获取子节点对象的有效值
// System.out.println(childNode.item(k).getNodeValue());//输出将为null,是因为该方法只能够获取当前子节点标签当中value属性值对象当中的有效值,而子节点
//标签之间所添加的信息内容则是属于当前子节点的子节点,所以是无法进行获取的
//获取子节点标签当中的数据信息,即获取element对象当中的值
// System.out.println("---节点值是:"+childNode.item(k).getFirstChild().getNodeValue());//获取当前子节点对象的第一个子节点,并将其有效值进行输出操作
System.out.println("---节点值是:"+childNode.item(k).getTextContent());//直接获取当前子节点对象当中的文本值数据信息
if(childNode.item(k).getNodeName().equals("name"))
{//当当前所解析的book子标签对象为name子标签时,将其对应的有效值存放到book实例化对象当中去
bookEmpty.setName(childNode.item(k).getTextContent());
}
if(childNode.item(k).getNodeName().equals("author"))
{//当前所解析到的为author子标签对象
bookEmpty.setAuthor(childNode.item(k).getTextContent());
}
if(childNode.item(k).getNodeName().equals("year"))
{
bookEmpty.setYear(childNode.item(k).getTextContent());
}
if(childNode.item(k).getNodeName().equals("price"))
{//如果当前所解析到的子标签对象为price标签
bookEmpty.setPrice(childNode.item(k).getTextContent());
}
if(childNode.item(k).getNodeName().equals("language"))
{
bookEmpty.setLanguage(childNode.item(k).getTextContent());
}
}
}
//当对book标签对象当中的全部子标签进行解析完成的同时对bookEmpty实例化对象当中的数据也保存完毕
bookEmptyList.add(bookEmpty);//将当前所解析完成的bookEmpty实例化对象保存到数组对象当中
bookEmpty=null;//清空当前bookEmpty实例化对象准备开始对下一个将要进行解析的book标签当中的数据信息值进行保存操作
System.out.println("==============================结束对第"+(i+1)+"本书的遍历操作。=========================================\n");
}
}
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();
}
//对bookEmptyList集合对象当中所存放的book实例化对象进行遍历输出操作
for(Book book:bookEmptyList)
{//对book集合对象当中的数据信息进行遍历输出操作
System.out.println(book.getId());
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPrice());
System.out.println(book.getYear());
System.out.println(book.getLanguage());
System.out.println("----------------finish--------------");
}
}
}
程序运行之后的结果为: