`
孔雀王子
  • 浏览: 42172 次
  • 性别: Icon_minigender_1
  • 来自: 河北
文章分类
社区版块
存档分类
最新评论

XML编程中的CRUD操作

阅读更多

一、 JAXP 简介

JAXP 使得用 Java 开发处理 XML 数据的应用程序非常容易,JAXP 包括语法分析器、标准 SAX DOM ,可以选择以事件流或建立对象表示来解析数据。JAXP 1.1 版本还支持XSLT 标准, 可以控制数据的表示, 并可以将数据转换成其他的XML 文件或格式, 如HTMLJAXP 还提供对名称空间的支持,可以在没有命名冲突的情况下使用 DTD

JAXP 提供的类和方法,可以让 Java 应用程序使用 DOM 解析或转换 XML 文件,在JDK 1.4 支持的JAXP API 1.1 版支持XML , 建议规格有DOM Level 2 XSLT 1.0SAX 2.0 。其解析文档对象模型的相关套件,见表。

  JAXP API 1.1 解析文档对象模型的相关套件

   

   

Javax.xml.parsers

提供处理XML 文件的类

Javax.xml.transform

提供处理XSLT 文件的类

org.xml.sax

这是SAX 解析器,提供以事件驱动方式解析XML 文件的AP

org.xml.saxhelpers

提供解析错误处理的相关类,可以帮助程序设计者使用SAX API

org.w3c.dom

提供支持DOM 建议规格的套件

二、加载 XML 文档文件

    Java 程序中加载 XML 文档文件,步骤如下。

1 、首先需要导入相关的套件。

     import javax.xml.parsers.*;

import org.xml.sax.*;

import org.w3c.dom.*;

import java.io.*;

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

所以导入文件处理的套件用 import java.io.*

2 、在 JAXP 中,DOM 解析器称为 DocumentBulider ,可以通过工厂类 DocumentBulider Factory 获得,而 document 对象则可以通过类 DocumentBulider 获得,使用 try catch 指令建立解析的错误处理。在建立 DocumentBulider 对象后,可使用 parser 方法解析加载 XML 文件,file 对象加载后就可以处理 XML 文件的结点内容。

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

// 获得根结点

Element element=document.getDocumentElement(); 

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

NodeList=element.getChildNodes();

三、XML编程——CRUD

    1 、访问 XML 元素和属性

    DOM 接口规范中,有 4 个基本接口:DocumentNodeNodeListElement 。在这4 个基本接口中,Document 接口是对文档进行操作的入口,它是从 Node 接口继承过来的。Node 接口是其他大多数接口的父类,像 DocumentElementTextComment 等接口都是从 Node 接口继承过来的。NodeList 接口是一个结点的集合,它包含了某个结点中的所有子结点。下面对这几个接口分别做一些简单的介绍。

*        Document 接口

Document 接口代表了整个 XML 文档,因此,它是整个文档树的根,提供了对文档中数据进行访问和操作的入口。通过 Document 结点,可以访问到文档中的其他结点,如处理指令、批注、文字等。

方法描述:

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

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

*        Node 接口

Node 接口在整个 DOM 树中具有举足轻重的地位,DOM 接口中很大一部分接口是从Node 接口继承过来的,例如 DocumentElementTextComment 等接口。在 DOM 树中,Node 接口代表了树中的一个结点。

方法描述:

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

2) getNodeName() ,返回结点名称,不同类型结点的值不同;

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

4) getNodeValue() ,返回结点的值;

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

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

7) getLastChild() ,获取最后一个子结点;

8) getParentNode() ,获取父结点;

9) hasChildNodes() Node 结点对象检查是否拥有子结点,是返回 true ,否则为 false

*        NodeList 接口

NodeList 接口提供了对结点集合的抽象定义, 它并不包含如何实现这个结点集的定义。NodeList 接口用于表示有顺序关系的一组结点,比如某个结点的子结点序列。其中的每个item 都可以通过一个索引来访问,该索引值从 0 开始。另外,它还出现在一些方法的返回值中。

方法描述:

(1) getLength() ,可获取 NodeList 对象共有多少结点,即结点的个数;

(2) item(int) ,返回参数制定的结点对象,参数是结点对象的索引值。

*        Element 接口

Element 接口是从 Node 接口继承过来的,它代表了 XML 文档中的元素。Element 接口提供了访问 DOM 树中元素内容与信息的途径,并给出了对 DOM 树中的元素进行遍历的支持。

方法描述:

(1) getElementsByTagName(string) ,通过标记名称获取元素;

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

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

(4) getAttributeNode(string) ,通过属性的名字得到一个属性类型结点。

下面通过一个实例来说明如何使用上述对象和方法来解析 XML 文档。

 

Demo1.java 代码清单如下:

package cn.csdn.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Demo1 {
	@Test
	public void test() {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setIgnoringComments(true);
		DocumentBuilder db;
		try {
			db = dbf.newDocumentBuilder();
			Document document = db.parse(new File("src\\code2.xml"));
			Node root = document.getDocumentElement();
			NodeList list = root.getChildNodes();
			display(list);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void display(NodeList list) {
		if (list.getLength() == 0) {
			System.out.println("该结点没有子结点!");
		}
		for (int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
			// 获取结点的类型,可以是ElementNode,TextNode,DocumentNode等
			short nodetype = node.getNodeType();
			if (nodetype == Node.ELEMENT_NODE) {
				System.out.println(node.getNodeName());
				if (node.hasAttributes()) {
					Node attribute = node.getAttributes().item(0);
					System.out.println(attribute.getNodeName() + " "
							+ attribute.getNodeValue());
				}
				if (node.hasChildNodes()) {
					display(node.getChildNodes());
				}
			}
			if (nodetype == Node.TEXT_NODE) {
				String txtName = node.getNodeName();
				// 取出text类型结点的值
				Node parent = node.getParentNode(); //此结点的父结点
				Node txtNode = parent.getChildNodes().item(0);
				String txtValue = txtNode.getNodeValue();
				if (txtValue.trim().length() > 0) {
					System.out.println(txtName + " " + txtValue);
				}
			}
		}
	}
}

 

 

2 、使用 DOM 创建 XML 文档

*        创建 XML 文档

可以使用 newDecument 方法建立 XML 文档。

Document=db.newDecument();

*        建立新的结点

使用 Document 对象的方法建立所需结点对象,见表。

                        建立新结点的方法

    

   

createElement(string)

建立XML 元素的结点,参数为标记名称

createAttribute(string)

建立属性名称的属性结点,参数是属性名称

createCDATASection(string)

建立CDATA 块,参数是文字内容

createComment(string)

建立注释文字结点,参数为注释文字内容

createTextNode(string)

建立文字结点,参数为内容

createEntityReference(string)

建立实体参考,参数为实体参考名称

createProcessingInstring(string,string)

建立PI 结点,第一个参数是PI 名称,第二个为值

 

 

*        指定插入的位置

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

Ø        appendChild(newnode) ,新添加一个 newnode 结点;

Ø        insertBefore(newnode,befnode) ,将 newnode 结点插到 befnode 结点前。

*        新增元素内容

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

*        新增元素的属性

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

使用 DOM 对象创建 XML 文件,代码清单如下:

package cn.csdn.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class Demo2 {
	// 使用DOM创建一个XML文档
	static Document document;
	@Test
	public void testAdd() {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 建立新的XML文档
			document = db.newDocument();
			// 建立根元素
			Element root = document.createElement("中国");
			document.appendChild(root);
			// 新增子元素 陕西省
			Element newchild = document.createElement("陕西省");
			root.appendChild(newchild);
			// 增加元素的内容
			newchild.appendChild(document.createTextNode("交通大学"));
			// 增加元素的属性
			newchild = (Element) root.getFirstChild();
			newchild.setAttribute("ID", "0x8905072");
			// 新增子元素 河北省
			newchild = document.createElement("河北省");
			root.appendChild(newchild);
			// 增加元素的内容
			newchild.appendChild(document.createTextNode("河北软件职业技术		学院"));
			// 新增子元素 北京市
			newchild = document.createElement("北京市");
			// 新增元素插入在根元素的最后一个节点前面
			root.insertBefore(newchild, root.getLastChild());
			// 新增文字节点
			Node text = document.createTextNode("中关村软件园");
			// 插入文字结点到根结点第一个子结点的兄弟结点,即第二子结点
			Node temp = root.getFirstChild();
			temp.getNextSibling().appendChild(text);
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer tf = tff.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult(
					"src\\code.xml"));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Test
	public void testIndexAdd() {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setIgnoringComments(true);
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 记载XML源文件
			document = db.parse(new File("src\\code2.xml"));
		// 获取节点,因为要将新增的子元素插在元素“海淀”之前,所以这里获取根元素“北京”的节点
			Node node = document.getElementsByTagName("北京").item(0);
			// 新增子元素
			Element ele = document.createElement("昌平");
			ele.appendChild(document.createTextNode("O(∩_∩)O哈哈~"));
		node.insertBefore(ele, node.getFirstChild()); // 将新增子元素“昌平”插入元素“海淀”的前面
			// 新增子元素
			ele = document.createElement("新密");
			// 获取节点
			node = document.getElementsByTagName("郑州").item(0);
			// // 将新增子元素“新密”插入元素“商丘”的前面
		node.insertBefore(ele, node.getFirstChild()); //插入元素“商丘”之后,则为node.getLastChild();
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer tf = tff.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult(
					"src\\code2.xml"));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

3、 使用DOM 删除元素或属性

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

// 删除第一个customer 结点

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

     // 删除属性

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

Node.removeAttribute("ID")

    看下面的代码片段。

public void test1()throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder builder  = factory.newDocumentBuilder();
		Document doc = builder.parse(new File("src\\dom.xml"));
		Node node = doc.getElementsByTagName("海淀").item(0);
		node.removeChild(doc.getElementsByTagName("东北旺").item(2));
		TransformerFactory factory1 = TransformerFactory.newInstance();
		
		Transformer tformer = factory1.newTransformer();
		tformer.transform(new DOMSource(doc), new StreamResult("src\\dom.xml"));
	}

 

4 、使用DOM 更改元素的值

	public void test2()throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder builder  = factory.newDocumentBuilder();
		Document doc = builder.parse(new File("src\\dom.xml"));
		Node node1 = doc.getElementsByTagName("东北旺").item(0);
		node1.setTextContent("未知地区");
		TransformerFactory factory1 = TransformerFactory.newInstance();
		Transformer tformer = factory1.newTransformer();
		tformer.transform(new DOMSource(doc), new StreamResult("src\\dom.xml"));
	}

 

以上案例使用的dom.xml 代码清单如下:

	<?xml version="1.0" encoding="UTF-8" standalone="no"?><中国>
	<北京>
		<海淀>
			<上地>上地七街</上地>
			<中关村>鼎好</中关村>
			<东北旺>哈哈</东北旺>
		<东北旺/></海淀>
	</北京>
	<河南>
		<郑州>
			<商丘 id="attr" 人口="100万">商丘中学</商丘>
		</郑州>
		<安阳/>
	</河南>
	<河北>
		<石家庄 人口="2000万"/>
	</河北>
</中国>

 

四、小结

    本文主要介绍 Java 应用程序如何使用 DOM 处理 XML 文件。要创建 DOM 需要使用JAXPJAXP 使得用Java 开发处理XML 文件的应用程序非常容易,只要在Java 程序中导入相关的套件, 如import javax.xml.parsers.* import org.xml.sax.* import org.w3c.dom.* import java.io.* ,就可以使用它所提供的类和方法,让 Java 应用程序使用 DOM 加载 XML 文件,访问、增加和删除 XML 元素和属性。

 

 

 

0
1
分享到:
评论

相关推荐

    xml文件操作详解crud操作

    在IT行业中,XML文件的操作是必不可少的技能,特别是CRUD(Create, Read, Update, Delete)操作,即创建、读取、更新和删除XML文件中的数据。下面将详细讲解XML文件的CRUD操作。 1. **创建(Create)** 创建XML...

    基于SSM框架的简单CRUD操作

    在"基于SSM框架的简单CRUD操作"中,你需要做以下步骤: 1. **环境配置**:确保你已经安装了Java环境、Maven(或Gradle)构建工具以及IDE。配置好Tomcat服务器,用于部署应用。 2. **项目创建**:创建一个SSM项目,...

    mybatis中使用接口编程方式实现CRUD模板

    在MyBatis框架中,接口编程方式是一种常见的实践,它使得业务逻辑与持久层操作更加解耦,提高了代码的可读性和可维护性。本文将深入探讨如何在MyBatis中利用接口实现CRUD(创建、读取、更新、删除)模板。 首先,让...

    inside xml xml编程从入门到精通

    XML(eXtensible Markup Language)是一...通过《Inside XML XML编程从入门到精通》,读者可以系统地学习XML的基础概念、解析技术、查询语言以及实际应用,从而在IT领域中更好地运用XML这一强大的数据表示和交换工具。

    基于SSM框架的简单的CRUD操作

    这个项目基于SSM框架实现了一个基础的CRUD(Create、Read、Update、Delete)操作,展示了如何在实际应用中整合这三个组件。 首先,Spring框架是整个项目的基石,它提供了依赖注入(Dependency Injection, DI)和...

    crud linq for xml

    "crud linq for xml"是指使用C#中的LINQ技术来执行XML文件的CRUD操作,即创建(Create)、读取(Read)、更新(Update)和删除(Delete)。下面将详细解释这些概念: 1. **创建(Create)**:在XML中创建新数据意味着生成新的...

    SSM框架CRUD操作以及分页

    在SSM中,MyBatis作为数据访问层,负责与数据库交互,执行CRUD操作。 **四、分页技术** 在处理大量数据时,分页是提高性能和用户体验的重要手段。在这个项目中,可能采用了自定义标签来实现分页。自定义标签可以在...

    mybatis基于Dao的crud操作源码

    在Mybatis中,CRUD操作主要通过Mapper接口和对应的XML配置文件完成。Mapper接口定义了数据库操作的方法,而XML配置文件则包含了具体的SQL语句。这种方式既保留了SQL的灵活性,又实现了Java对象与数据库表之间的映射...

    XML.rar_crud_javascript_javascript xml_xml_增删改查英文

    XML(eXtensible Markup ...总的来说,这个压缩包中的内容涵盖了XML的基础操作以及结合JavaScript实现的CRUD功能,还有简单的国际化处理。对于开发者来说,理解和掌握这些技能对于处理和展示结构化数据是至关重要的。

    Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)

    在登录和CRUD操作中,Spring可能通过AOP实现权限控制,或使用IoC管理业务逻辑和服务对象。 **Hibernate3.6** Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用Java对象来操作数据库,减少了直接SQL的...

    struts_crud

    在Struts框架中实现CRUD操作,可以让我们更高效地开发Web应用。 Struts的CRUD实现主要涉及以下几个方面: 1. **Action类**:这是处理用户请求的核心组件。每个Action类对应一个业务逻辑,比如创建新记录、读取记录...

    《ASP.NET 2.0 XML 高级编程(第3版)》

    《ASP.NET 2.0 XML 高级编程...总的来说,《ASP.NET 2.0 XML 高级编程(第3版)》是一本全面覆盖ASP.NET 2.0中XML应用的指南,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅,提升在XML编程方面的专业技能。

    xml 高级编程7-8

    在学习XML高级编程的这两章中,你将掌握如何有效地使用这些工具和技术,以更高效、准确地处理XML数据,提升你的XML编程能力。通过实践和案例分析,你将能深入理解XML在实际项目中的应用,并能够解决XML相关的复杂...

    Struts_Spring_Hibernate_CRUD操作案例_-分页查询

    在这个“Struts_Spring_Hibernate_CRUD操作案例_分页查询”中,我们将深入探讨如何整合这三大框架实现数据的创建、读取、更新、删除(CRUD)以及分页查询。 1. **Struts框架**: - **Action类**:它是业务逻辑的...

    ASP.NET_XML深入编程技术

    ASP.NET可以使用ADO.NET访问XML数据,通过DataSet和DataTable对象加载XML,实现对XML数据的CRUD操作。此外,XML可以被用作DataSet的持久化格式,方便数据的存储和传输。 八、XML配置文件 ASP.NET应用程序广泛使用...

    ssm框架的crud例子

    在本示例中,Controller可能是处理CRUD操作的入口。 **3. MyBatis** MyBatis是一个持久层框架,它简化了SQL与Java代码的交互,将SQL语句写在XML配置文件或注解中,与Java对象映射。在SSM框架中,MyBatis作为数据...

    SSH整合开发CRUD

    在CRUD操作中,Spring可以管理Service层和DAO层的实例,通过配置文件或者注解来实现bean的生命周期管理。 Struts2是MVC(Model-View-Controller)设计模式的实现,负责接收用户请求,调度控制器并返回响应结果到...

    SSM_CRUD所需jar包.rar

    在SSM框架中,MyBatis主要负责与数据库的交互,通过XML或注解定义SQL语句,使得CRUD操作更简单、灵活。 4. **jar包的作用**:这些jar包包含了SSM框架的类库,如spring-context、spring-webmvc、mybatis-spring、...

    ssh2项目 实现登陆,crud操作,用aop控制事物

    这个项目实例着重于如何利用SSH2实现登录功能,以及CRUD(创建、读取、更新和删除)操作,并通过AOP(面向切面编程)来控制事务。 **1. Struts2** Struts2是MVC(模型-视图-控制器)设计模式的一个实现,主要用于...

Global site tag (gtag.js) - Google Analytics