笔记 ------XML解析<二>

DOM生成XML文档和解析XML文档

在内存中形成文档对象模型树可以反复操作该树形结构

<?xml version="1.0" encoding="UTF-8"?>
<book-list>
	<book id="a">
		<name>Java葵花宝典</name>
		<author>SUN</author>
		<price>50</price>
	</book>

	<book id="c">
		<name>凤凰周刊</name>
		<author>凤凰</author>
		<price>30</price>
	</book>
	<book id="d">
		<name>J.K.罗琳 </name>
		<author />
		<price>80</price>
	</book>
</book-list>
 
package dom;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class DomParser {

	public static void main(String[] args) {
		//创建DOM解析器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			//得到Dom解析器
			DocumentBuilder builder = factory.newDocumentBuilder();
			//得到XML文档路径
			String path = DomParser.class.getClassLoader().getResource("books.xml").getPath();
			//根据XML文档路径,获取给XML的文档的文档对象模型
			Document doc = builder.parse(path);
			//获取根元素
			Element root = doc.getDocumentElement();
			
			//遍历XML文档
			iteratorElement(root);
			
			//创建一个新的book元素, 并写入到books.xml文档中
			createElement(root, doc, "src/books.xml");
			System.out.println("**********************");
			iteratorElement(root);
			
			getByElementName(root);
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 遍历ele下的所有元素,并输出其文本信息
	 * @param ele
	 */
	
	private static void iteratorElement(Element ele){
		NodeList list = ele.getChildNodes();
		for(int i = 0; i < list.getLength(); i++){
			if(Element.ELEMENT_NODE == list.item(i).getNodeType()){
				Element childEle = (Element) list.item(i);
				if(childEle.hasAttributes()){
					System.out.println("id = " + childEle.getAttribute("id"));
				}else{
					System.out.println(childEle.getTagName() + " = " + childEle.getTextContent());
					if(childEle.getTagName().equals("price")){
						System.out.println();
					}
				}
				iteratorElement(childEle);
			}
			
		}
	}
	
	/**
	 * 创建一个新的book元素,并写入到XML文档中
	 * @param root
	 * @param doc
	 */
	private static void createElement(Element root, Document doc, String path){
		//创建book元素
		Element book = doc.createElement("book");
		book.setAttribute("id", "d");
		//创建name元素
		Element name = doc.createElement("name");
		name.setTextContent("哈利波特");
		//创建author元素
		Element author = doc.createElement("author");
		name.setTextContent("J.K.罗琳 ");
		
		//创建price元素
		Element price = doc.createElement("price");
		price.setTextContent("80");
		
		//构建元素结构关系
		book.appendChild(name);
		book.appendChild(author);
		book.appendChild(price);
		root.appendChild(book);
		
		TransformerFactory tf = TransformerFactory.newInstance();
		try {
			Transformer transformer = tf.newTransformer();
			//设置格式
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			//将文档对象模型输出到XML文档中
			transformer.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(path)));
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		}
	}
	
	/**
	 * 通过标记名获取元素节点
	 * @param root
	 */
	private static void getByElementName(Element root){
		NodeList nodeList = root.getElementsByTagName("book");
		for(int i= 0; i < nodeList.getLength(); i++){
			Element ele = (Element)nodeList.item(i);
			System.out.println(ele.getAttribute("id"));
		}
	}
}
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值