java中以DOM方式来对xml文件进行解析操作

要进行解析的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--------------");
		}
	}

}

程序运行之后的结果为:




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值