1、基础知识:
Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。
2、使用介绍
1)、DOM
(1)简介
由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。
(2)示例代码:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<TelePhone>
<type name="nokia">
<price>599</price>
<operator>CMCC</operator>
</type>
<type name="xiaomi">
<price>699</price>
<operator>ChinaNet</operator>
</type>
</TelePhone>
</root>
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringReader;
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.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class XMLHandler {
public XMLHandler(){
}
public String createXML(){
String xmlStr = null;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
document.setXmlVersion("1.0");
Element root = document.createElement("root");
document.appendChild(root);
Element telephone = document.createElement("TelePhone");
Element nokia = document.createElement("type");
nokia.setAttribute("name", "nokia");
Element priceNokia = document.createElement("price");
priceNokia.setTextContent("599");
nokia.appendChild(priceNokia);
Element operatorNokia = document.createElement("operator");
operatorNokia.setTextContent("CMCC");
nokia.appendChild(operatorNokia);
telephone.appendChild(nokia);
Element xiaomi = document.createElement("type");
xiaomi.setAttribute("name", "xiaomi");
Element priceXiaoMi = document.createElement("price");
priceXiaoMi.setTextContent("699");
xiaomi.appendChild(priceXiaoMi);
Element operatorXiaoMi = document.createElement("operator");
operatorXiaoMi.setTextContent("ChinaNet");
xiaomi.appendChild(operatorXiaoMi);
telephone.appendChild(xiaomi);
root.appendChild(telephone);
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transFormer = transFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//export string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
transFormer.transform(domSource, new StreamResult(bos));
xmlStr = bos.toString();
//-------
//save as file
File file = new File("TelePhone.xml");
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
StreamResult xmlResult = new StreamResult(out);
transFormer.transform(domSource, xmlResult);
//--------
} 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();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return xmlStr;
}
public void parserXML(String strXML){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
Document doc = builder.parse(is);
Element rootElement = doc.getDocumentElement();
NodeList phones = rootElement.getElementsByTagName("type");
for (int i = 0; i < phones.getLength(); i++) {
Node type = phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("Phone name = "+phoneName);
NodeList properties = type.getChildNodes();
for (int j = 0; j < properties.getLength(); j++) {
Node property = properties.item(j);
String nodeName = property.getNodeName();
if (nodeName.equals("price")) {
String price=property.getFirstChild().getNodeValue();
System.out.println("price="+price);
} else if (nodeName.equals("operator")) {
String operator=property.getFirstChild().getNodeValue();
System.out.println("operator="+operator);
}
}
}
} 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 main(String[] args) {
XMLHandler handler = new XMLHandler();
String xml = handler.createXML();
System.out.println(xml);
handler.parserXML(xml);
}
}
(3)元素(Element)和结点(Node)的区别(org.w3c.dom)
Node对象是整个文档对象模型的主要数据类型,是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等。
Element对象表示HTML或XML文档中的一个元素,是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法。
Element是从Node继承而来的,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>。但是一个结点不一定是一个元素,而一个元素一定是一个结点。
node有几个子类型:Element,Text,Attribute,RootElement,Comment,Namespace等
2)、SAX
3)、JDOM
4)、DOM4J
(1)简介
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。
在使用XPATH时要增加jaxen.jar,否则会出现如下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
(2)示例代码:
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.xml.sax.InputSource;
public class XMLHandler {
public XMLHandler() {
// TODO Auto-generated constructor stub
}
public String createXML(){
String strXML = null;
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
Element phone = root.addElement("TelePhone");
Element nokia = phone.addElement("type");
nokia.addAttribute("name", "nokia");
Element price_nokia = nokia.addElement("price");
price_nokia.addText("599");
Element operator_nokia = nokia.addElement("operator");
operator_nokia.addText("CMCC");
Element xiaomi = phone.addElement("type");
xiaomi.addAttribute("name", "xiaomi");
Element price_xiaomi = xiaomi.addElement("price");
price_xiaomi.addText("699");
Element operator_xiaomi = xiaomi.addElement("operator");
operator_xiaomi.addText("ChinaNet");
//--------
StringWriter strWtr = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter xmlWriter =new XMLWriter(strWtr, format);
try {
xmlWriter.write(document);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
strXML = strWtr.toString();
//--------
//-------
//strXML=document.asXML();
//------
//-------------
File file = new File("TelePhone.xml");
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
XMLWriter out = new XMLWriter(new FileWriter(file));
out.write(document);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//--------------
return strXML;
}
public void parserXML(String strXML){
SAXReader reader = new SAXReader();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
try {
Document document = reader.read(is);
Element root = document.getRootElement();
//get element
List<Element> phoneList = root.elements("TelePhone");
List<Element> typeList = phoneList.get(0).elements("type");
for (int i=0;i<typeList.size();i++){
Element element = typeList.get(i);
String phoneName = element.attributeValue("name");
System.out.println("phonename = "+phoneName);
//get all element
List<Element> childList = element.elements();
for (int j=0;j<childList.size();j++){
Element e = childList.get(j);
System.out.println(e.getName()+"="+e.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void parserXMLbyXPath(String strXML){
SAXReader reader = new SAXReader();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
try {
Document document = reader.read(is);
List list = document.selectNodes("/root/TelePhone/type");
for(int i=0;i<list.size();i++){
Element e = (Element) list.get(i);
System.out.println("phonename="+e.attributeValue("name"));
List list1 = e.selectNodes("./*");
for(int j=0;j<list1.size();j++){
Element e1 = (Element) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
XMLHandler handler = new XMLHandler();
String strXML=handler.createXML();
System.out.println(strXML);
handler.parserXML(strXML);
System.out.println("-----------");
handler.parserXMLbyXPath(strXML);
}
}
5)XPATH
(1)简介
XPath是一门在XML文档中查找信息的语言。XPath用于在XML文档中通过元素和属性进行导航。
具体语法介绍参考:http://w3school.com.cn/xpath/index.asp
(2)示例代码:
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
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.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class XMLHandler {
public XMLHandler() {
// TODO Auto-generated constructor stub
}
public void parserXML(String strXML){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
StringReader sr = new StringReader(strXML);
InputSource is = new InputSource(sr);
Document doc = builder.parse(is);
XPathFactory xFactory = XPathFactory.newInstance();
XPath xpath = xFactory.newXPath();
XPathExpression expr = xpath.compile("/root/TelePhone/type");
NodeList phones = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < phones.getLength(); i++) {
Node type = phones.item(i);
String phoneName = ((Element)type).getAttribute("name");
System.out.println("Phone name = "+phoneName);
XPathExpression expr1 = xpath.compile("./*");
NodeList list = (NodeList) expr1.evaluate(type, XPathConstants.NODESET);
for(int j =0;j<list.getLength();j++){
Element e1 = (Element) list.item(j);
System.out.println(e1.getNodeName()+"="+e1.getTextContent());
}
}
} 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();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String strXML="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"+
"<root>"+
"<TelePhone>"+
"<type name=\"nokia\">"+
"<price>599</price>"+
"<operator>CMCC</operator>"+
"</type>"+
"<type name=\"xiaomi\">"+
"<price>699</price>"+
"<operator>ChinaNet</operator>"+
"</type>"+
"</TelePhone>"+
"</root>";
XMLHandler handler = new XMLHandler();
handler.parserXML(strXML);
}
}
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress


猜你喜欢
- Android 中在有序广播中添加自定义权限的实例前言;有序广播说明:有序广播因为要处理消息的处理结果,所以要复杂一些。 * sendOrd
- 前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法:具体实例代码如下:public cl
- 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和
- 1.首先要导入json相关的jar包引入的jar包:(版本自行定义,可以选用使用人数偏多的版本,这样比较稳定)commons-beanuti
- Java如何实现线程中断?通过调用Thread类的实例方法interrupt。如下:Thread thread = new Thread()
- Scala异常处理Scala是一种多范式的编程语言,支持面向对象和函数式编程。Scala也支持异常处理,即在程序运行过程中发生意外或错误时,
- 今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了。自定义Recyc
- springboot:接收date类型的参数今天有个postmapping方法,地址都正确,就是死活进不去,真是奇怪了。终于从日志中得出些端
- 关于Retrofit的学习,我算是比较晚的了,而现在Retrofit已经是Android非常流行的网络请求框架了。之前,我没有学过Retro
- final可以修饰类 ,成员变量,局部变量和方法。1.final修饰成员变量1.final成员变量的初始化对于final修饰的变量,系统不会
- 学习要求:知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习。1.先体验一下Stream的好处需求:给你一个ArrayLi
- 1、Fragment的静态使用Fragment是作为Activity的UI的一部分,它内嵌在Activity中,多个Fragment可以把一
- 一、APP通过View修改鼠标样式app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法
- 我们公司做了一款使用百度钱包的移动网页支付进行支付的产品,用户通过百度钱包、百度糯米扫描我们产品的二维码,选择商品,点击支付将会自动调用百度
- public interface ArraySQL 类型 ARRAY 在 java 编程语言中的映射关系。默认情况下,Array 值是对 S
- 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种:源代码 -> 编译器优化的重排 -> 指令并
- forword跳转页面的三种方式:1.使用serlvet/** * 使用forward跳转,传递基本类型参数到页面  
- 曾经遇到过这样的问题,在我的代码中使用了通知栏,一切都正常,但是就是正在进行的通知栏中属于我的程序的那一条总是上下跳来跳去,一闪一闪的。感觉
- 前言上一篇文章用贝塞尔曲线画了一个看起来不错的小红点功能,技术上没什么难度,主要就是数学上的计算。这篇文章也差不多,模仿了一个常用的滑动解锁
- A:首先先看下一个简单的面试题斐波那契数列计算数组{1,1,2,3,5,8.......} 第30位值规律:1 1 从第三项开始,每一项都是