java操作xml文档

目前最常用的XML解析技术是DOM和SAX。

DOM是基于XML的树结构来完成解析的,适用于多次访问的XML文档,但是DOM解析比较消耗资源;而SAX是基于事件解析,适用于大数据量的XML文档,占用资源少,内存消耗小。

DOM是文档对象模型(Document Object Model)

首先DOM会将XML文档映射成一颗倒挂的树,在这棵树中,每个节点都是以节点对象的形式存在的。

我们通过操作这些对象就可以完成XML文件的读写任务了。

我们可以直接根据节点的名称或属性查找该节点对象,也可以根据一个节点查找其子节点或父节点的方式来寻找所需要的节点。然后对xml文档进行操作,使用这样的思路操作xml文件,我们称之为DOM解析。

使用DOM解析XML文档的步骤主要有:

1、创建解析器工厂。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2、由解析器工厂对象创建解析器对象。

DocumentBuilder db = dbf.newDocumentBuilder();

3、由解析器对象对指定xml文件进行解析。构建相应的DOM树,创建Document对象。

Document doc = db.parse("src/收藏信息.xml");

4、以Document对象为起点对DOM树的节点进行增删改查操作。

Document是个接口,他提供了对整个XML文档数据的基本访问。

常用方法 说明
NodeList getElementsByTagName(String tagName) 按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName) 创建指定标记名称的元素

操作XML的两个重要接口:Node和Element。

区别:Node表示文档树中的任意一种节点,可以是元素节点、属性节点或是文本节点等多种节点。Element则只表示Node节点中的元素节点。Node是Element的父接口。

Node

常用方法 说明
NodeList getChildNodes() 获取该元素的所有子节点,返回为节点集合

Element

常用方法 说明
String getTagName() 元素名称

下面看一个具体的实例,了解DOM具体如何操作XML文档

首先新建一个名为收藏信息的xml文档,具体内容如下:

<PhoneInfo>
<Brand name="Apple">
<Type name="iPhone4"/>
<Type name="iPhone5"/>
</Brand>
<Brand name="华为">
<Type name="U8650"/>
</Brand>
</PhoneInfo>

然后看具体解析过程(包括对该XML文档的增删改查):

package com.pb.test;

import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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.NodeList;

import com.pb.entity.Item;

public class Test {

	public static void main(String[] args) {
		//showItemByNum(1);
		//savePhone();
		//modify();
		delete();
	}

	public static void delete(){
		try {
			// 1、得到DOM解析器的工厂实例
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// 2、从DOM工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 3、解析XML文档,得到一个Document,即DOM树
			Document doc = db.parse("src/收藏信息.xml");
			//找到删除的节点
			NodeList list=doc.getElementsByTagName("Brand");
			for(int i=0;i<list.getLength();i++){
				Element brandElement=(Element)list.item(i);
				String brandName=brandElement.getAttribute("name");
				if(brandName.equals("联想")){
					brandElement.getParentNode().removeChild(brandElement);
				}
			}

			//保持XML文件
			TransformerFactory transformerFactory = TransformerFactory
					.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(doc);
			//设置编码类型
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			StreamResult result = new StreamResult(new FileOutputStream("src/收藏信息.xml"));
			//把DOM树转换为XML文件
			transformer.transform(domSource, result);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void modify(){
		try {
			// 1、得到DOM解析器的工厂实例
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// 2、从DOM工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 3、解析XML文档,得到一个Document,即DOM树
			Document doc = db.parse("src/收藏信息.xml");
			//找到修改的节点
			NodeList list=doc.getElementsByTagName("Brand");
			for(int i=0;i<list.getLength();i++){
				Element brandElement=(Element)list.item(i);
				String brandName=brandElement.getAttribute("name");
			    if(brandName.equals("苹果")){
			    	//修改属性
			    	brandElement.setAttribute("name", "Apple");
			    }
			}			

			//保持XML文件
			TransformerFactory transformerFactory = TransformerFactory
					.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(doc);
			//设置编码类型
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			StreamResult result = new StreamResult(new FileOutputStream("src/收藏信息.xml"));
			//把DOM树转换为XML文件
			transformer.transform(domSource, result);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void savePhone() {
		try {
			// 1、得到DOM解析器的工厂实例
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// 2、从DOM工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 3、解析XML文档,得到一个Document,即DOM树
			Document doc = db.parse("src/收藏信息.xml");
			//创建brand节点
			Element brandElement= doc.createElement("Brand");
			brandElement.setAttribute("name", "华为");
			//创建Type节点
			Element typeElement=doc.createElement("Type");
			typeElement.setAttribute("name", "U8650");
			//添加父子关系
			brandElement.appendChild(typeElement);
			Element phoneElement=(Element)doc.getElementsByTagName("PhoneInfo").item(0);
			phoneElement.appendChild(brandElement);

			//保持XML文件
			TransformerFactory transformerFactory = TransformerFactory
					.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			DOMSource domSource = new DOMSource(doc);
			//设置编码类型
			transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
			StreamResult result = new StreamResult(new FileOutputStream("src/收藏信息.xml"));
			//把DOM树转换为XML文件
			transformer.transform(domSource, result);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static List<Item> showItem() {
		try {
			// 1、得到DOM解析器的工厂实例
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			// 2、从DOM工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			// 3、解析XML文档,得到一个Document,即DOM树
			Document doc = db.parse("src/网易手机各地行情.xml");
			// 4、读取新闻
			NodeList list = doc.getElementsByTagName("item");

			ArrayList<Item> itemList = new ArrayList<Item>();
			for (int i = 0; i < list.getLength(); i++) {
				Item item = new Item();

				Element itemElement = (Element) list.item(i);
				String title = itemElement.getElementsByTagName("title")
						.item(0).getFirstChild().getNodeValue();
				String description = itemElement.getElementsByTagName(
						"description").item(0).getFirstChild().getNodeValue();
				String link = itemElement.getElementsByTagName("link").item(0)
						.getFirstChild().getNodeValue();
				String pubDate = itemElement.getElementsByTagName("pubDate")
						.item(0).getFirstChild().getNodeValue();

				item.setDescription(description);
				item.setLink(link);
				item.setPubDate(pubDate);
				item.setTitle(title);

				itemList.add(item);

			}
			return itemList;

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return null;
		}
	}

	public static void showItemByNum(int num) {
		List<Item> listItem = showItem();
		Item item = listItem.get(num - 1);
		System.out.println(num + "\t" + item.getPubDate() + "\t"
				+ item.getTitle());
	}

}

java操作xml文档

时间: 2024-11-04 20:14:40

java操作xml文档的相关文章

操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)

原文:操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP) 不管是用 PHP 还是 C#, 在操作 XML 的时候我们除了一个节点一个节点去取值之外, 还有一个非常方便的表达式, 就是 XPATH 而昨晚在使用 XPATH 的时候, 遇到一个问题, 改了一个晚上才搞定, 差点没吐血. 果然基础知识要掌握扎实啊!! 假设有以下一份 XML 文档: 我们要获取所有歌曲的标题, 一般是使用以下的 XPATH 表达式: 代码如下: /playlist/trackList/track/tit

C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子子节点:每一个节点有开始就一定会有结束,不可能出现有开始无结束的节点,节点主要有两种类型:有InnerText的<city>……</city>和没有InnerText的<city……/>.在节点中含有属性,一个节点可以含有多个属性,每个属性是由名字和值共同构成的. 在XML

C#操作xml文档增删改查(Linq to XML)

1.创建xml 1 public static void CreateXmlDoc() 2 { 3 XElement myDoc = 4 new XElement("Customers", 5 new XElement("Customer", new XAttribute("ID", "1"), 6 new XElement("Usename", "Rock Zed"), 7 new X

浅谈用java解析xml文档(四)

继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使用dom4j解析,个人认为是四种解析方式里面最方便的一种,DOM4J是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用D

浅谈用java解析xml文档(三)

接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析.生成.序列化及其它操作. 我们从以下步骤开始解析: (1).通过JDOM的API创建一个SAXBuilder的对象 SAXBuilder saxBuilder

浅谈用java解析xml文档(一)

关于xml本身的语法及使用的环境不多说了,网上有很多规则, 然对xml文档进行解析,一般分为四种解析方式,基于java官方文档的Dom 和Sax解析,还有就是基于 第三方jar包的 Jdom 和 Dom4j解析. 一.首先我们来看Dom解析: 1.定义工厂,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 在应用程序获取对 DocumentBuil

Java对XML文档的解析

1. DOM解析 DOM的全称是Document Object Model,也即文档对象模型.DOM解析会将XML文档以对象树的方式存入内存,因此,DOM解析内存消耗巨大.当然由于DOM解析将XML以节点树的方式调入内存,所以对文档进行增删改查(crud)比较方便.DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高.而且,对于结构复杂的树的遍历也是一项耗时的操作.所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想. ---

java将XML文档转换成json格式数据

功能 将xml文档转换成json格式数据 说明 依赖包: 1. jdom-2.0.2.jar : xml解析工具包; 2. fastjson-1.1.36.jar : 阿里巴巴研发的高性能json工具包 程序源码 package com.xxx.open.pay.util; import com.alibaba.fastjson.JSONObject; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdo

文档对象模型操作xml文档

简介 :文档对象模型(DOM)是一种用于处理xml文档的API函数集. 2.1文档对象模型概述 按照W3C的定义,DOM是“一种允许程序或脚本动态地访问更新文档内容,结构和样式的.独立于平台和语言的规范化接口.DOM是表示文档(比如HTML和XML)和访问.操作构成文档的各种元素的应用程序接口,它以树状结构表示HTML和XML文档,定义了遍历这个树和检查.修改树的节点的方法和属性. DOM的核心API还允许你创建和填充文件.加载文档并保存. 2.2DOM实现 微软的net框架在Systemx.x