JAXP总结(Java API for XML Processing 总结)

1.JAXP(java API for XML Processing)

   JAXP使得用java开发处理XML数据的应用程序非常容易,JAXP包括语法分析器、标准SAX与DOM,可以选择以事件流或建立对象表示来解析数据。

   JAXP提供的类和方法,可以让java应用程序使用DOM解析或转换XML文件。

2.常用的DOM接口

   DOM定义了一套标准的接口以便按照程序的设计显示XML文档。当然,DOM不能实现定义的接口,而支持DOM的XML解析器必须实现DOM所定义的接口。

3.加载XML文档文件

   (1)首先需要导入相关的套件

import javax.xml.parsers.*;

import org.sax.*;

import org.w3c.dom.*;

import java.io.*;

 其中org.sax.*套件是解析错误处理的相关套件,此外因为XML文件属于文本文件,导入文件处     理的套件java.io.*。

   (2)在JAXP中,DOM解析器称为DocumentBuilder,可以通过工厂类DocumentBuilderFactory获得        ,而document对象则可以通过类DocumentBuilder获得,使用try catch指令建立解析的错误        处理。在建立DocumentBuilder对象后,可使用parser方法解析加载XML文件,file对象加载        后就可以处理XML文件的节点内容,程序架构如下:

//获得一个XML文件的解析器

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();

try{

   //解析XML文件生成DOM文档的接口类,以便访问DOM

   DocumentBuilder db=dbf.newDocumentBuilder();

   document=db.parser(new File("xml文件"));

   ...

}catch(Exception ef){

ef.printStackTrack();

}

   (3)获得接口类document实例后,就可以对DOM的文档树进行访问。如要遍历DOM文档,首先要获得根节点,然后获得根节点的子节点列表。

//获得根节点

Element element=document.getDocumentElement();

//获得根节点的子节点列表

NodeList childs=element.getChildNodes();

package XML操作1004;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class code10_1 {
	static Document document;
	public static void main(String[] args) {
//		if(args.length!=1){
//			System.out.println("加载XML file");
//			return;
//		}
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		try{
			dbf.setIgnoringElementContentWhitespace(true);
			DocumentBuilder db=dbf.newDocumentBuilder();
			//读入xml文档
			document=db.parse(new File("C:\\Users\\chenshao\\workspace\\java操作数据库\\src\\XML操作1004\\code10_1.xml"));
			//遍历xml文档
			walkNode(document.getDocumentElement());
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	private static void walkNode(Node anode){
		NodeList child=anode.getChildNodes();
		printNode(anode);
		for(int i=0;i<child.getLength();i++){
			Node node=child.item(i);
			if(node.hasChildNodes()){
				walkNode(node);
			}else{
				printNode(node);
			}
		}
	}
	private static void printNode(Node bnode){
		System.out.println(bnode.getNodeName()+","+bnode.getNodeValue());
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
<!--DOCTYPE customers SYSTEM "code10_2.dtd"-->
<customers>
	<customer ID="c0555103">
		<username>cheaperget</username>
		<password>12345678</password>
		<email>[email protected]</email>
		<registerdate>200508</registerdate>
		<address>
			<zipcode>361021</zipcode>
			<phone>0592-6888888</phone>
			<street>xx省xx市银江路108号</street>
		</address>
	</customer>
	<customer ID="c0555208">
		<username>dreaninboy</username>
		<password>22345678</password>
		<email>[email protected]</email>
		<registerdate>200505</registerdate>
		<address>
			<zipcode>215006</zipcode>
			<phone>0512-6188888</phone>
			<street>xx省xx市人民路108号</street>
		</address>
	</customer>

</customers>

 4.访问XML元素和属性

   在DOM接口规范中,有4个基本接口:Document、Node、NodeList、Element。在这4个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,入Document、Element,Text、Comment等接口都是从Node接口继承错来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。

1.Document接口

  Document接口代表了整个XML文档,因此,它是整个文档树的根,提供了对文档中数据进行 访问和操作的入口。通过Document节点,可以访问到文档中的其他节点。

   方法描述:

(1)getDocumentElement(),Document对象使用该方法可获取XML文件的根节点

(2) getElementByTagName(),Document使用标记名获取子节点,取出的节点是一个    NodeList对象。

2.Node接口

  在DOM树中,Node接口代表了树中的一个节点

    方法描述:

(1)getChildNodes(),获取子节点的NodeList节点对象列表,即子节点数

(2)getNodeName(),返回节点名称

(3)getNodeType(),返回节点类型的代码

(4)getNodeValue(),返回节点的值

(5)getFirstChild(),获取第一个子节点

(6)getNextSibling(),获取此节点的兄弟节点,即同级的下一个节点

(7)getLastChild(),获取最后一个节点

(8)getParentNode(),获取父节点

(9)hasChildNodes(),Node节点对象检查是否拥有子节点,是返回TRUE,否FALSE

3.Element接口

  Element接口代表了XML文档中的元素,提供了访问DOM树中元素内容与信息的途径。

     方法描述:

(1)getElementByTagName(String),通过标记名称获取元素

(2)getTagName(),获取元素的标记的名称

(3)getAttributes(String),获取元素的属性,是属性对象列表,属于NamedNodeMap

(4)getAttributeNode(String),通过属性的名字得到一个属性类型节点

4.NamedNodeMap属性列表对象

    NamedNodeMap对象可以获取元素的属性列表,因为一个元素可以有多个属性。

   访问特定的元素和属性,可以使用Document对象的getElementByName方法获取指定的XML元素。如获得password标记的第二个password标记:

//获得password标记的NodeList节点列表

NodeList passwords=Document.getElementByTagName("password");

//item方法指出为第二个password标记

system.out.println("元素名称:"+passwords.item(1).getNodeName());

package XML操作1004;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class code10_3 {
	static Document document;
	public static void main(String[] args) {
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		try{
			DocumentBuilder db=dbf.newDocumentBuilder();
			//读入xml文档
			document=db.parse(new File("C:\\Users\\chenshao\\workspace\\java操作数据库\\src\\XML操作1004\\code10_1.xml"));//文件路径
			//获得根元素
			Node root=document.getDocumentElement();
			//获得根元素的子节点列表
			NodeList childs=root.getChildNodes();
			getElement(childs);
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	public static void getElement(NodeList childs){
		int i=0;
		if(childs.getLength()==0){
			//该节点没有子节点
			System.out.println("该节点没有子节点!");
		}
		for(i=0;i<childs.getLength();i++){
			//获取第i个子节点
			Node node=childs.item(i);
			//获取节点的类型,可以是ElementNode,TextNode,DocumentNode等
			short nodetype=node.getNodeType();
			//ElementNode类型的节点可以包含子节点和属性等
			if(nodetype==Node.ELEMENT_NODE){
				//得到节点的名称
				String name=node.getNodeName();
				String attrValue="",attrName="";
				System.out.println("这是一个元素,名字是:"+name);
				if(node.hasAttributes()){
					/*取出一个元素的属性,得到的是一个属性对象列表(NameNodeMap)在此因为文档中只有一个属性,所以只取
					 * NameNodeMap中的第0个值*/
					Node attrNode=node.getAttributes().item(0);
					//取出该节点的Name和value,即是一个ElementNode的属性名称和属性值
					attrName=attrNode.getNodeName();
					attrValue=attrNode.getNodeValue();
					System.out.println("this element attr is:"+attrValue+";attrName is:"+attrName);
				}
				//如果有子节点,递归调用getElement()
				if(node.hasChildNodes()){
					getElement(node.getChildNodes());
				}
			}
			//Text类型没有子节点,节点名为#text,节点的值为xml文档中元素的值
			if(nodetype==Node.TEXT_NODE){
				//该节点的name是#text
				String txtName=node.getNodeName();
				String txtValue=node.getNodeValue();
				if(txtValue.trim().length()>0){
					System.out.println("txtName:"+txtName+";txtValue:"+txtValue);
				}
			}
		}
	}

}

 XML文件仍为code10_1.xml

5.使用DOM创建XML文档

   1)创建XML文档

可以使用newDocument方法创建XML文档

document=db.newDocument();

   2)建立新的节点

使用Document对象的方法建立所需节点对象

      方法说明

createElement(String)建立XML元素的节点,参数为标记名称

createAttribute(string)建立属性名称的属性节点,参数是属性名称

createCDATASection(string)建立CDATA块,参数是文字内容

createComment(String)建立注释文字节点,参数为注释文字内容

createTextNode(String)建立文字节点,参数为内容

   3)指定插入的位置

在建立好XML元素的对象好,可以使用Node节点对象的方法添加到DOM树中:

appendChild(newNode),新添加一个newNode节点

insertBefore(newNode,befnode),将newNode节点插到befnode节点前

   4)新增元素内容

使用 createTextNode方法建立文字节点后,在使用appendChild方法将它添加到元素节点中

   5)新增元素的属性

使用setAttribute方法给Element元素对象增加属性

   6)删除元素或属性

如果要删除节点可使用Node节点的removeChild方法删除指定的节点,如果要删除属性可以使      用Element元素对象的removeAttribute方法删除

//删除第一customer节点

root.removeChild((Element)root.getElementsByTagName("customer").item(0));

//删除属性

Element node=(Element)root.getFirstChild();

node.removeAttribute("ID");

package XML操作1005;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class code10_5 {
	static Document document;
	public static void main(String[] args) throws Exception{
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		DocumentBuilder db=dbf.newDocumentBuilder();
		//建立新的Xml文件
		document=db.newDocument();
		//建立根元素
		Element root=(Element)document.createElement("customer");
		document.appendChild(root);
		//新增子元素customerID
		Element newNode=(Element)document.createElement("customerID");
		root.appendChild(newNode);
		//增加元素的内容
		newNode.appendChild(document.createTextNode("ID"));
		//增加元素的属性
		newNode=(Element) root.getFirstChild();
		newNode.setAttribute("ID", "c050013");
		//新增子元素username
		newNode=document.createElement("username");
		root.appendChild(newNode);
		//增加元素的内容
		newNode.appendChild(document.createTextNode("cheaperget"));
		//新增子元素password
		newNode=document.createElement("password");
		//新增元素插在根元素的最后一个孩子前面
		root.insertBefore(newNode, root.getLastChild());
		//增加元素的内容
		Node text=document.createTextNode("12345678");
		//插入内容节点到根节点的第二个孩子节点
		Node temp=root.getFirstChild();
		temp.getNextSibling().appendChild(text);
		//显示XML文件
		System.out.println("根元素:"+root.getNodeName());
		//获取根元素的所有子节点
		NodeList childs=root.getChildNodes();
		for(int i=0;i<childs.getLength();i++){
			//显示元素的名字和元素的内容
			System.out.println("元素:"+childs.item(i).getNodeName());
			System.out.println("/"+childs.item(i).getFirstChild().getNodeValue());
			//显示元素的属性
			if(childs.item(i).hasAttributes()){
				//属性列表
				NamedNodeMap atts=childs.item(i).getAttributes();
				//使用for循环获取各属性的名称和值
				for(int j=0;j<atts.getLength();j++){
					Node att=atts.item(j);
					System.out.println("--"+att.getNodeName());
					System.out.println("/"+att.getNodeValue());
				}
			}
		}
		
	}

}

 

你可能感兴趣的:(JAXP总结(Java API for XML Processing 总结))