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());
}
}
具体的参见源代码就行了
分享到:
相关推荐
本教程将介绍如何使用Java解析XML文件,并将解析结果导入MySQL数据库。 首先,我们需要引入处理XML的Java库——JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)API。JAXB用于对象与XML...
【Java解析XML】 Java提供了多种方式来解析XML文档,包括DOM解析和SAX解析,这两种方式各有优缺点,适用于不同的场景。本章将详细介绍这两种解析方法,并通过实例讲解如何使用Java来获取XML文档中的标签内容和属性...
JAVA 解析XML和生成XML文档源码。比较全 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
java教材-使用Java解析XML(IT jb就业培训).doc
本篇将详细介绍如何使用Java解析XML,将数据存入MongoDB,并返回org.json JSON包。 首先,解析XML通常有两种主要方法:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个XML文档到内存...
Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...
java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...
java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...
### Java解析XML字符串 在给定的代码示例中,我们看到了如何使用JDOM库来解析一个XML字符串,并对其进行操作。下面我们将详细解析这个过程: 1. **初始化XML源**:首先,将XML字符串转化为`StringReader`对象,这...
本篇文章将详细讲解如何使用Java解析XML文件,并修改其中的特定路径值。 首先,我们需要了解Java中解析XML的两个主要库:DOM(Document Object Model)和SAX(Simple API for XML)。DOM一次性加载整个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解析技术:SAX、DOM、StAX以及JAXB,并对它们的特点、适用场景进行对比分析。 ### 1. SAX 解析器 #### 1.1 定义 SAX(Simple ...
* 本类是专门解析XML文件的,主要用于为系统读取自己的配置文件时提供最方便的解析操作 * @author HX * */ public class XmlManager { /** * 得到某节点下某个属性的值 * @param element 要获取属性的...
本文将深入探讨几种不同的XML解析方法,并通过实际的“Java解析XML性能对比分析Demo”来展示它们的性能差异。我们将讨论DOM、SAX、JDOM、DOM4J和JAXB这五种解析器,以及它们各自的特点和适用场景。 1. DOM(文档...
### Java解析XML的四种方式详解 #### 一、DOM(Document Object Model) DOM是一种平台和语言中立的接口,它将XML文档表示为一个树结构,使得程序可以创建、读取、更新或删除树中的元素。DOM实现了W3C的标准,能够...
本篇文章将深入探讨如何在Java中解析XML,以帮助你理解和实践相关知识。 一、DOM解析器 DOM(Document Object Model)解析器是Java中的一种常用方法,它将整个XML文档加载到内存中,形成一个树形结构。以下是一个...
java解析xml的四种方法的比较,还有四种方法所用到的jar包 附带程序例子 1.DOM生成和解析XML文档 2.SAX生成和解析XML文档 3.DOM4J生成和解析XML文档 4.JDOM生成和解析XML
总结起来,实现“java解析xml动态生成树形菜单结构”的项目,需要掌握以下核心知识点: 1. Java的DOM解析XML,构建树形数据结构。 2. 设计和实现无限层级的树形菜单数据模型。 3. 使用`JSTree`库在前端渲染树形菜单...