运维开发网

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

运维开发网 https://www.qedev.com 2020-03-10 12:27 出处:网络 作者: shangke
1、基础知识: Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。 2、使用介绍 1)、DOM

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

精彩评论

暂无评论...
验证码 换一张
取 消