Java生成和解析XML格式文件和字符串

来源:互联网 发布:sql注入测试网站 编辑:程序博客网 时间:2024/05/29 08:50

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



0 0