您的位置:首页 > 编程语言 > Java开发

Java生成和解析XML格式文件和字符串的实例代码

2014-09-05 11:59 866 查看


Java生成和解析XML格式文件和字符串的实例代码

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: