`

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>notknown@yahoo.com</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>greatman@yahoo.com</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());
				}
			}
		}
		
	}

}

 

分享到:
评论

相关推荐

    JSR 206 Java API for XML Processing (JAXP) 1.3

    JSR 206 Java API for XML Processing (JAXP) 1.3

    使用JAXP处理XML文件.pdf

    JAXP是JAVA API for XML Processing的缩写。本教程属于清晰版

    XML和JSP交互技术

    所幸的是我们不用去写底支持层东西了,因为很多厂商如SUN、IBM等都发布了自己的支持XML的API,其中SUN公司提供了一个支持在Java下使用XML的API-JAXP(JAVATM API for XML Processing Optional Package),这部分API...

    Java and XML(英文第三版)

    including full coverage of the SAX, DOM, StAX, JDOM, and dom4j APIs as well as the latest version of the Java API for XML Processing (JAXP) and Java Architecture for XML Binding (JAXB). The chapters ...

    XML processing with Java

    Representing an entire XML document using the Document Object Model (DOM) Level 2 • Using DOM to display the outline of an...• Hiding vendor-specific details with the Java API for XML Processing (JAXP)

    Java语言编程中更新XML文档的四种常用方法

    本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析...JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。 JAXP支持DOM、SAX、XSLT等标准。

    High-Performance XML Processing

    (eBook) - Computers - JAVA+XML - ts2599 - High-Performance XML Processing - Techniques & Tips With the Java API for XML Processing (JAXP) 1.3.pdf

    Java编程中更新XML文档的常用方法

     JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口。JAXP支持DOM、SAX、XSLT等标准。为了增强JAXP使用上的灵活性,开发者特别为JAXP设计了一个...

    JBoss Application Server

    The J2EE platform manages the infrastructure and ... Java API for XML Processing (JAXP) 1.1 Java Authentication & Authorization Service (JAAS) 1.0 CORBA Integration (RMI/IIOP, IDL, EJB-CORBA Mapping

    JAXP.rar_time series

    Java promises "portable code" and XML assures "portable data". These two technologies can be used together to architect enterprise ... This time, we ll focus on Java API for XML Processing (or JAXP).

    jdk-9.0.1_doc-all 最新版

    Defines the Java API for XML Processing (JAXP), the Streaming API for XML (StAX), the Simple API for XML (SAX), and the W3C Document Object Model (DOM) API. java.xml.bind Defines the Java ...

    java7帮助文档

    This release contains Java API for XML Processing (JAXP) 1.4.5, supports Java Architecture for XML Binding (JAXB) 2.2.3, and supports Java API for XML Web Services (JAX-WS) 2.2.4. ...

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    Standards and styles for coding Java programs. New-to-JavaTM Programming Center. New to the Java Platform. Java™ Platform Standard Ed. 6 All Classes Packages java.applet java.awt java.awt.color...

    JavaEE 5.0 Tutorial.pdf

    For Sun Java System Application Server 9.1 Contents Preface ...............................................................................................................................................

Global site tag (gtag.js) - Google Analytics