`
剑锋凛冽
  • 浏览: 75740 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用java解析XML

阅读更多

Java本身提供了三种API进行XML文本的解析。

1.DOM:DOM方式解析XML文本时,先分析整个XML,形成XML的DOM树,然后节点列表的方式遍历它。

 

package xmlHandler;

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.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DOMParserXml {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        DOMParserXml domparser=new DOMParserXml();
        domparser.domParserForXML(System.getProperty("user.dir")+"/person.xml");
        domparser.XPathGetValue(System.getProperty("user.dir")+"/person.xml");
	}

	// DOM解析器生成tree,解析过程也必须严格按照tree结构写成循环解析
	public void domParserForXML(String xmlPath) {
		Person person = new Person();// 用于存放解析出的值
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建XML的DOM工厂
		
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			File xmlFile = new File(xmlPath);// 可以用InputStream、URL、File来设置XML来源
			Document doc = builder.parse(xmlFile);// 读入文档,这是一个接口
			Element root = doc.getDocumentElement();// 获取根节点
			System.out.println("根节点名称:" + root.getTagName());
			NodeList children = root.getChildNodes();// 这里的child可以使文本、子元素、其他节点
			for (int i = 0; i < children.getLength(); i++) {
				Node child = children.item(i);
				//使用语句factory.setIgnoringElementContentWhitespace(true);//过滤空白字符,就不需要判断类型了。
				if (child instanceof Element) {// 解析器将标签之间的空格也认为是子元素,用instanceof过滤它们
					
					Element childElement = (Element) child;
					System.out.print("\t子节点名称" + childElement.getTagName());
					System.out.println("\t属性值:"
							+ childElement.getAttribute("sex"));
					//可以通过getAttributes方法获取所有属性值的键值对。
					person.setSex(childElement.getAttribute("sex"));
					NodeList grandsons = childElement.getChildNodes();
					for (int j = 0; j < grandsons.getLength(); j++) {
						Node grandson = grandsons.item(j);
						if (grandson instanceof Element) {
							Element grandElement = (Element) grandson;
							System.out.print("\t\t孙节点名称:"
									+ grandElement.getTagName());
							Text textNode = (Text) grandElement.getFirstChild();
							System.out.println("\t孙节点文本值:"
									+ textNode.getData().trim());
							if (grandElement.getTagName().equals("name")) {
								person.setName(textNode.getData().trim());
							}
							if (grandElement.getTagName().equals("description")) {
								person
										.setDescription(textNode.getData()
												.trim());
							}
						}
					}
				}
			}
		} 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();
		}
		System.out.println("解析结果:::" + person.toString());
	}

	
	public void XPathGetValue(String xmlFilePath){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 创建XML的DOM工厂
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			File file=new File(xmlFilePath);
			Document doc=builder.parse(file);
			//通过XPath表达式快速访问XML文件的节点及其文本值
			XPathFactory xpathFactory=XPathFactory.newInstance();
			XPath xpath=xpathFactory.newXPath();
			System.out.println("==============使用XPath快速访问XML节点值:");
			String query="/persons/person/name";
			System.out.println(xpath.evaluate(query, doc));
			
		} 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 (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 2.SAXParser使用事件流驱动的方式进行XML文本的解析。

 

package xmlHandler;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParserXML {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			SAXParser parser = factory.newSAXParser();
			File file = new File(System.getProperty("user.dir") + "/person.xml");
			parser.parse(file, new PersonXMLHandler());// 此处的file可以使文件、输入流、或URL字符串
		} 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();
		}

	}

}

class PersonXMLHandler extends DefaultHandler {
	Person person;
	String temp = "";
	String currenttag = null;

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		if (currenttag != null) {
			String value = new String(ch, start, length);
			if (currenttag.equals("name")) {
				person.setName(value);
			}
			if (currenttag.equals("description")) {
				temp += value;// 处理长文本
			}
		}
	}

	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		currenttag=null;
		if (qName.endsWith("description")) {
			person.setDescription(temp);
			temp = "";
		}
		if (qName.endsWith("person"))
			System.out.println("当前解析出的结果:" + person.toString());
	}

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if (qName.equals("person")) {
			person = new Person();
			person.setSex(attributes.getValue("sex"));
		}
		currenttag = qName;
	}

}

 3,StAX同样也是事件流驱动的解析器,只是不再进行startElement、characters的区分。

 

package xmlHandler;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class StAXParserXML {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        StAXParserXML parser=new StAXParserXML();
        parser.StAXParser(System.getProperty("user.dir") + "/person.xml");
	}

	// StAXParser 是一种“pull parser”,允许通过循环来迭代访问所有事件
	public void StAXParser(String xmlPath) {
		XMLInputFactory factory = XMLInputFactory.newInstance();
		Person person=new Person();
		File file = new File(xmlPath);
		try {
			//参数必须是InputStream类型,可以是File的包装器、URL打开的InputStream
			XMLStreamReader parser = factory
					.createXMLStreamReader(new FileInputStream(file));
			// parser遍历xml文档时产生一系列事件
			while (parser.hasNext()) {
				int event = parser.next();// 获取当前event
				if (event == XMLStreamConstants.START_ELEMENT) {//如果是element
					if (parser.getLocalName().equals("person")) {//判断标签值
						person.setSex(parser.getAttributeValue(0));//获取属性值
					}
					if(parser.getLocalName().equals("name")){
						person.setName(parser.getElementText());//获取元素文本
					}
					if(parser.getLocalName().equals("description")){
						person.setDescription(parser.getElementText());
					}
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XMLStreamException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}// 这里的参数只能是InputStream
		System.out.println(person.toString());
	}

}

 具体的参见源代码就行了

分享到:
评论
2 楼 剑锋凛冽 2012-07-02  
cuisuqiang 写道
java解析xml有多种方式,目前jdk6已经包含了pull解析,可以学习一下去

多谢关注,我在文章里已经写过,StAX就是一种pull解析器,它允许只解析一部分内容就直接终止对整个文件的事件流访问,而SAX不能这样,必须完成整个文档的事件触发才能结束
1 楼 cuisuqiang 2012-06-29  
java解析xml有多种方式,目前jdk6已经包含了pull解析,可以学习一下去

相关推荐

    使用java解析XML文件,解析完之后将解析结果导入mysql数据库中

    本教程将介绍如何使用Java解析XML文件,并将解析结果导入MySQL数据库。 首先,我们需要引入处理XML的Java库——JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)API。JAXB用于对象与XML...

    使用Java解析XML

    【Java解析XML】 Java提供了多种方式来解析XML文档,包括DOM解析和SAX解析,这两种方式各有优缺点,适用于不同的场景。本章将详细介绍这两种解析方法,并通过实例讲解如何使用Java来获取XML文档中的标签内容和属性...

    JAVA 解析XML生成XML文档实例

    JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    java教材-使用Java解析XML(IT jb就业培训).doc

    java教材-使用Java解析XML(IT jb就业培训).doc

    Java 解析xml 存入mongodb 返回org.json json包

    本篇将详细介绍如何使用Java解析XML,将数据存入MongoDB,并返回org.json JSON包。 首先,解析XML通常有两种主要方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文档到内存...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    java 解析xml 多级

    Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    java解析xml字符串

    ### Java解析XML字符串 在给定的代码示例中,我们看到了如何使用JDOM库来解析一个XML字符串,并对其进行操作。下面我们将详细解析这个过程: 1. **初始化XML源**:首先,将XML字符串转化为`StringReader`对象,这...

    java 解析XML修改路径值

    本篇文章将详细讲解如何使用Java解析XML文件,并修改其中的特定路径值。 首先,我们需要了解Java中解析XML的两个主要库:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文档到...

    java解析XML文件

    Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...

    JAVA 解析xml

    JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法 JAVA 解析xml多种方法

    java解析xml及4种常用解析比较

    因此,掌握如何使用Java解析XML是非常必要的技能。本文将详细介绍Java中四种常用的XML解析技术:SAX、DOM、StAX以及JAXB,并对它们的特点、适用场景进行对比分析。 ### 1. SAX 解析器 #### 1.1 定义 SAX(Simple ...

    Java解析XML工具类--(java源码)

    * 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...

    java 解析XML性能对比分析Demo

    本文将深入探讨几种不同的XML解析方法,并通过实际的“Java解析XML性能对比分析Demo”来展示它们的性能差异。我们将讨论DOM、SAX、JDOM、DOM4J和JAXB这五种解析器,以及它们各自的特点和适用场景。 1. DOM(文档...

    java解析XML的四种方式

    ### Java解析XML的四种方式详解 #### 一、DOM(Document Object Model) DOM是一种平台和语言中立的接口,它将XML文档表示为一个树结构,使得程序可以创建、读取、更新或删除树中的元素。DOM实现了W3C的标准,能够...

    java解析xml例子

    本篇文章将深入探讨如何在Java中解析XML,以帮助你理解和实践相关知识。 一、DOM解析器 DOM(Document Object Model)解析器是Java中的一种常用方法,它将整个XML文档加载到内存中,形成一个树形结构。以下是一个...

    Java解析XML的jar包+四种解析方法

    java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML

    java解析xml动态生成树形菜单结构

    总结起来,实现“java解析xml动态生成树形菜单结构”的项目,需要掌握以下核心知识点: 1. Java的DOM解析XML,构建树形数据结构。 2. 设计和实现无限层级的树形菜单数据模型。 3. 使用`JSTree`库在前端渲染树形菜单...

Global site tag (gtag.js) - Google Analytics