DOM解析XML文档

1.XML解析方式分为两种:dom和sax
2.XML解析器
Crimson、Xerces 、Aelfred2
3.XML解析开发包
Jaxp、Jdom、dom4j
4.使用jaxp解析xml文档
在 javax.xml.parsers 包中,定义了几个工厂类,调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
5.DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
6.使用jaxp进行DOM解析
1)调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
2)调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

3)调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

package cn.lsl.xml;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

/**
 * 得到dom解析器
 * @author LSL
 *
 */
public class Demo1 {
	public static void main(String[] args) throws Exception {
		//得到创建 DOM 解析器的工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//得到 DOM 解析器对象
		DocumentBuilder builder = factory.newDocumentBuilder();
		System.out.println(builder);
		//调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
		Document document = builder.parse("src/cn/lsl/xml/book.xml");
	}
}

7.增删改查XML文档

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
	<书>
		<书名>java</书名>
		<作者 id="12">小明</作者>
		<售价 type="rmb">19元</售价> 
	</书> 
	<书>
		<书名>javaweb</书名>
		<作者>wangwu</作者>
		<售价>28.00元</售价>
	</书>
</书架>

package cn.lsl.xml;

import java.io.FileOutputStream;

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


import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class Demo {
	private Document document;
	@Before
	public void before() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		document = builder.parse("src/cn/lsl/xml/book.xml");
	}
	
	
	//遍历
	@Test
	public void listXml(){
		list(document);
	}
	 public void list(Node node){
		 System.out.println(node.getNodeName());
		 NodeList list = node.getChildNodes();
		 for(int i=0; i<list.getLength(); i++){
			 Node child = list.item(i);
			 list(child);
		 }
	 }
	 
	 
	 
	 //获取节点的值
	 @Test
	 public void test1(){
		 Document document = this.document;
		 Node node = document.getElementsByTagName("书名").item(0);
		 String value = node.getTextContent();
		 System.out.println(value);
	 }
	 
	 
	 获得节点属性
	 @Test
	 public void test2(){
		 Document document = this.document;
		 Node node = document.getElementsByTagName("售价").item(0);
		 
		 Element price = (Element)node;
		 String attValue = price.getAttribute("type");
		 System.out.println(attValue);
	 }
	 
	 
	 //添加节点
	 @Test
	 public void test3() throws Exception{
		 Document document = this.document;
		 //创建要添加的节点
		 Element price = document.createElement("售价");
		 price.setTextContent("30元");
		 //把创建的节点添加到书节点下
		 Node book = document.getElementsByTagName("书").item(0);
		 book.appendChild(price);
		 
		 //把内存中更新后的树对象,重新定位到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), 
				new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
		
	 }
	 
	 //向指定位置上添加售价节点
	 @Test
	 public void test4() throws Exception{
		 Document document = this.document;
		 
		 //创建要添加的节点
		 Element price = document.createElement("售价");
		 price.setTextContent("22元");
		 
		 //得到要挂的节点
		 Node book = document.getElementsByTagName("书").item(0);
		 //向参考节点前,挂新节点
		 book.insertBefore(price, document.getElementsByTagName("售价").item(0));
		 //保存
		 
		 TransformerFactory factory = TransformerFactory.newInstance();
		 Transformer tf = factory.newTransformer();
		 tf.transform(new DOMSource(document), 
				 new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
	 }
	 
	 
	 //向xml文档中添加节点属性
	 @Test
	 public void test5() throws Exception{
		 Document document = this.document;
		 
		 //得到要添加的属性的节点
		 Element author = (Element)document.getElementsByTagName("作者").item(0);
		 author.setAttribute("id", "1");
		 //保存
		 
		 TransformerFactory factory = TransformerFactory.newInstance();
		 Transformer tf = factory.newTransformer();
		 tf.transform(new DOMSource(document), 
				 new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
		 
	 }
	 
	 
	 //删除xml文档中的售价节点 
	 @Test
	 public void test6() throws Exception{
		 Document document = this.document;
		 //得到要删除的节点 
		 Node price = document.getElementsByTagName("售价").item(0);
		 //得到要删除的节点的夫节点
		 Node parent = document.getElementsByTagName("书").item(0);
		 parent.removeChild(price);
		 //保存
		 TransformerFactory factory = TransformerFactory.newInstance();
		 Transformer tf = factory.newTransformer();
		 tf.transform(new DOMSource(document), 
				 new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
	 }
	 
	 //删除售价节点所在的书节点
	@Test
	public void test7() throws Exception{
		Document document = this.document;
		//得到要删除的节点
		Node price = document.getElementsByTagName("售价").item(0);
		price.getParentNode().getParentNode().removeChild(price.getParentNode());
		//保存
		 TransformerFactory factory = TransformerFactory.newInstance();
		 Transformer tf = factory.newTransformer();
		 tf.transform(new DOMSource(document), 
				 new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
	}
	
	
	//更新节点
	@Test
	public void test8() throws Exception{
		Document document = this.document;
		document.getElementsByTagName("售价").item(1).setTextContent("55元");
		//保存
		 TransformerFactory factory = TransformerFactory.newInstance();
		 Transformer tf = factory.newTransformer();
		 tf.transform(new DOMSource(document), 
				 new StreamResult(new FileOutputStream("src/cn/lsl/xml/book.xml")));
	} 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值