javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析)

Jaxp解析开发包

 

  •   JAXP 开发包是J2SE的一部分,它由javax.xmlorg.w3c.domorg.xml.sax 包及其子包组成
  •   在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的DOMSAX 的解析器对象。

 

DOM解析方式:

步骤:

1.        调用javax.xml.parsers 包中DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

2.        调用工厂对象的newDocumentBuilder方法得到 DOM 解析器对象。

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

 

DOM解析器在解析XML文档的时候,会把文档中的所有元素都解析成一个个的对象(包括文本),这些对象都实现了一个共同的接口:Node。

Document中,节点之间关系如下:

  •   位于一个节点之上的节点是该节点的父节点(parent)
  •   一个节点之下的节点是该节点的子节点(children)
  •   同一层次,具有相同父节点的节点是兄弟节点(sibling)
  •   一个节点的下一个层次的节点集合是节点后代(descendant)
  •   父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

 

Node对象提供了一系列常量来代表节点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的具体对象(Node的子类对象),以便于调用其特有的方法。

怕强转错的话,先判断一下这个Node的类型等不等于某个常量。

只有Element才能操作节点的属性。

只有Document可以创建节点,只有父节点能删掉和添加这个节点。增、删、改都只是跟新了内存,还需要将内存中的document跟新到工程中的xml文档中去。

 

更新XML文档:

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如:把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

  •   通过javax.xml.transform.TransformerFactory类获得Transformer对象。
  •   Transformer对象通过transform方法完成转换操作,该方法接收一个来源和一个目的地。我们可以通过:
  •   javax.xml.transform.dom.DOMSource类来关联来源于内存的document对象,
  •   用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。

 

package cn.mengmei.jaxp;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
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.Node;
import org.w3c.dom.NodeList;

public class Demo1 {

	public static void main(String[] args) throws Exception {

		//得到工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		//得到解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		
		//解析xml文档,得到Document对象
		//String path = Demo1.class.getClassLoader().getResource("book.xml").getPath();
		//System.out.println(path);
		Document document = builder.parse("src/book.xml");
		
		//read(document);
		
		//update(document);
		
		//add(document);
		
		//delete(document);
		
		//updateAttribute(document);
		
		//list(document);
		
		//根节点
		System.out.println(document.getDocumentElement().getTagName());
	}
	
	//遍历所有节点
	public static void list(Node node){
		if(node.getNodeType() == node.ELEMENT_NODE){
			System.out.println(node.getNodeName());
		}
		
		NodeList list = node.getChildNodes();
		for(int i=0;i<list.getLength();i++){
			list(list.item(i));
		}
	}

	public static void updateAttribute(Document document) throws Exception {
		Node node = document.getElementsByTagName("书").item(0);
		
		Element ele = null;
		if(node.getNodeType() == node.ELEMENT_NODE){ //做节点转换之前,最好先判断节点类型。
			ele = (Element)node;
		}
		ele.setAttribute("name", "yyy");
		//ele.setAttribute("password", "123");
		//ele.removeAttribute("password");
		
		//跟新xml文档
		TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));
	}

	public static void delete(Document document) throws Exception {
		//得到第二个售价节点
		Node node = document.getElementsByTagName("售价").item(1);
		
		//用这个售价节点的父节点将此节点删掉
		node.getParentNode().removeChild(node);
		
		//将内存跟新到xml文档中
		TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));
	}

	public static void add(Document document) throws Exception {
		//用document创建一个售价节点
		Element ele = document.createElement("售价");
		//为售价节点设置textContent
		ele.setTextContent("59元");
		
		//将新建的售价节点 挂到document的书节点 下
		//document.getElementsByTagName("书").item(0).appendChild(ele);//只跟新了内存
		document.getElementsByTagName("书").item(0).insertBefore(ele, document.getElementsByTagName("售价").item(0));
		
		//将内存中的document跟新到工程中的xml文档中去:
		TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));
	}

	public static void update(Document document) throws Exception {
		Node node = document.getElementsByTagName("售价").item(0);
		node.setTextContent("109.00元");                           //只跟新了内存中的值。
		
		//把内存中的document写到工程中的xml文档中去:
		
		//利用javax.xml.transform包中的工厂类得到转换器对象
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer transformer = factory.newTransformer();
		
		//将内存中的document转成DOMSource
		DOMSource source = new DOMSource(document);
		
		//将工程中的xml文件封装到StreamResult中
		StreamResult result = new StreamResult("src/book.xml");
		
		//将source转成result
		transformer.transform(source, result);
	}

	public static void read(Document document) {
		NodeList list = document.getElementsByTagName("售价");
		Node node = list.item(0);
		String content = node.getTextContent();
		System.out.println(content);
	}
	
}



 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值