zoukankan      html  css  js  c++  java
  • Java生成和解析XML格式文件和字符串的实例代码

    这篇文章主要介绍了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);
        }

    }

  • 相关阅读:
    88. 合并两个有序数组
    680. 验证回文字符串 Ⅱ
    345. 反转字符串中的元音字母
    633. 平方数之和
    分支程序设计
    scanf函数(初学者)
    输入与输出(初学者)
    C语句详细(初学者)
    算术运算符和算术表达式(初学者)
    变量赋值(初学者)
  • 原文地址:https://www.cnblogs.com/tianshiaimi/p/xml.html
Copyright © 2011-2022 走看看