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

更多Java生成和解析XML格式文件和字符串的实例代码相关文章请关注PHP中文网!

更多相关文章

  1. php操作xml入门之xml基本介绍及xml标签元素
  2. 解析php DOMElement 操作xml 文档的实现代码
  3. XML指南——XML元素
  4. 给XML文档添加新 ”records”
  5. XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象
  6. XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容
  7. Dom4j修改xml文档引入
  8. 根据Schema写出XML文档四部曲
  9. xml学习(2)xml文档树结构图

随机推荐

  1. Android 中RelativeLayout各个属性的含义
  2. Android Studio安装完后,遇到了sdk manage
  3. 关于android中的.9图(一)——如何画.9图
  4. android 五子棋实验总结
  5. Android拷贝工程不覆盖原工程的配置方法
  6. 请介绍下Android中常用的五种布局
  7. 《Android传感器高级编程》
  8. Android 高级UI组件
  9. Android找不到Manifest系统文件
  10. Android Spinner自动弹出列表,设置title