Java generates and parses instance code for XML format files and strings

  • 2020-04-01 02:57:28
  • OfStack

1. Basic knowledge:
Java generally has four methods for parsing XML: DOM, SAX, JDOM, and DOM4J.

2. Introduction to use
1), DOM
(1) introduction

An interface provided by the W3C (org.w3.dom) that reads the entire XML document into memory and builds a dom tree to manipulate individual nodes. The advantage is that the entire document is always in memory, we can access any node at any time, and the tree traversal is a familiar operation; The downside is that it consumes memory and must wait until all documents are read into memory before processing can take place.

(2) sample code:


<?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) the difference between Element and Node (org.w3c.dom)
The Node object is the main data type of the entire document object model, the most basic object in the DOM, and represents the abstract Node in the document tree. However, in practice, Node objects are rarely used directly. Instead, the child objects of Node objects are Element,Attr,Text, etc.
The Element object represents an Element in an HTML or XML document and is the primary child of the Node class. It can contain attributes in an Element, so there are methods in the Element to access its attributes.
Element is inherited from Node. An Element is a small definition. It must be a Node with complete information to be an Element. Div> . < / div> . But a node doesn't have to be an element, and an element has to be a node.
Node has several subtypes: Element, Text, Attribute, RootElement, Comment, such as the Namespace

2), the SAX


3), JDOM

4), DOM4J
(1) introduction
Dom4j is currently the best at XML parsing (Hibernate, Sun's JAXM also USES dom4j to parse XML), and it incorporates many features beyond the basic XML document representation, including integrated XPath support, XML Schema support, and event-based processing for large documents or streamed documents.
Add jaxen.jar when using XPATH, or the following error will occur:


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) sample code:


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) introduction
XPath is a language for finding information in XML documents. XPath is used to navigate through XML documents through elements and attributes.
Specific syntax introduced reference: http://w3school.com.cn/xpath/index.asp

(2) sample code:


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: here are a few more online tools about XML operation for your reference:

Online XML/JSON interconversion tool:
(link: http://tools.jb51.net/code/xmljson)

Online formatted XML/ online compressed XML:
(link: http://tools.jb51.net/code/xmlformat)

XML online compression/formatting tools:
(link: http://tools.jb51.net/code/xml_format_compress)


Related articles: