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

}

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

(0)

相关推荐

  • java使用xpath解析xml示例分享

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初 XPath 的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是 XPath 很快的被开发者采用来当作小型查询语言. XPathTest.java 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java

  • java中使用sax解析xml的解决方法

    在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

  • java使用xpath和dom4j解析xml

    1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种,一种叫SAX,另一种叫DOM.SAX是基于事件流的解析,DOM是基于XML文档树结构的解析.在此基础上,为了减少DOM.SAX的编码量,出现了JDOM,其优点是,20-80原则(帕累托法则),极大减少了代码量.通常情况下JDOM使用时满足要实现的功能简单,如解析.创建等要求.但在底层,JDOM还是使用SAX(最常用).DOM.Xanan文档.另外一种是DOM4J,是一个非常非常优秀的Java XML API,

  • java 使用JDOM解析xml文件

    JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析.生成.序列化以及多种操作.JDOM直接为JAVA编程服务.它利用更为强有力的JAVA语言的诸多特性(方法重载.集合概念以及映射),把SAX和DOM的功能有效地结合起来.JDOM的官方地址:http://www.jdom.org/1.首先新建一个接口和2个类,为后续做准备[Moveable.java] 复制代码 代码如下: package com.njupt.zhb.test;public interface Mov

  • java实现简单解析XML文件功能示例

    本文实例讲述了java实现简单解析XML文件功能.分享给大家供大家参考,具体如下: package demo; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException;

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • java解析XML几种方式小结

    java解析XML几种方式小结 第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制. DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依

  • Java解析XML的四种方法详解

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

  • java dom4j解析xml用到的几个方法

    1. 读取并解析XML文档: 复制代码 代码如下: SAXReader reader = new SAXReader(); Document document = reader.read(new File(fileName)); reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取.得到的Document对象就带表了整个XML. 读取的字符编码是按照XML文件头定义的编码来转换.如果遇到乱码问题,注意要把各处的编码名称保持一致即可. 2. 取

  • Java中对XML的解析详解

    先简单说下前三种方式: DOM方式:个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析: SAX方式:基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情:个人感觉一种很另类的方式,不知道.Net体系下是否有没有类似的方式? StAX方式:个人理解类似.net的XmlReader方式,效率高,占用内存少,适用大XML的解析: 不过SAX方式之前也用过,本文主要介绍JAXB,这里只贴下主要代码

  • java解析xml常用的几种方式总结

    各种方法都用过.现在总结一下. 经常记不住,要找资料.现在总结一下. xml 文件如下: 复制代码 代码如下: <?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book category="COOKING">  <title lang="en">Everyday Italian</title>  <a

随机推荐