DOM解析XML实例

来源:互联网 发布:徐老师淘宝外设店 编辑:程序博客网 时间:2024/06/06 05:10

本文转自:http://blog.csdn.net/guchuanhang/article/details/51866114

Java中操作DOM中常用的类

  • Node 
    数据类型基类
  • Element 
    最常用的类
  • Attr 
    Element的属性
  • Text 
    Element or Attr的内容
  • Document 
    代表整个XML文档,代表DOM tree

使用DOM的步骤

1.导入相关类

import org.w3c.dom.*;import javax.xml.parsers.*;import java.io.*;Create a DocumentBuilder
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2.创建DocumentBuilder对象

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

3.从文件或流中创建Document对象

StringBuilder xmlStringBuilder = new StringBuilder();xmlStringBuilder.append("<?xml version=\"1.0\"?> <class> </class>");ByteArrayInputStream input =  new ByteArrayInputStream(   xmlStringBuilder.toString().getBytes("UTF-8"));Document doc = builder.parse(input);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

4 提取根元素

Element root = document.getDocumentElement();
  • 1
  • 2
  • 1
  • 2

5 处理属性&&子节点

//returns specific attributeelement.getAttribute("attributeName"); //returns a Map (table) of names/valueselement.getAttributes();//Examine sub-elements//returns a list of subelements of specified nameelement.getElementsByTagName("subelementName"); //returns a list of all child nodeselement.getChildNodes(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

XML文件解析实例一

放到项目根目录下的,需要解析的input.txt文件,其内容如下:

<?XML version="1.0"?><class>   <student rollno="393">      <firstname>dinkar</firstname>      <marks>85</marks>   </student>   <student rollno="493">      <firstname>Vaneet</firstname>      <marks>95</marks>   </student>   <student rollno="593">      <firstname>jasvir</firstname>      <marks>90</marks>   </student></class>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

解析代码如下:

package com.example.xmlparse;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;public class FirstDOMParseDemo {    public static void main(String[] args) {        try {            File inputFile = new File("input.txt");            //1.create DocumentBuilder object            DocumentBuilderFactory dbFactory                    = DocumentBuilderFactory.newInstance();            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();            //2.create Document object            Document doc = dBuilder.parse(inputFile);            doc.getDocumentElement().normalize();            //get root node            System.out.println("Root element :"                    + doc.getDocumentElement().getNodeName());            //3.get student list;            NodeList nList = doc.getElementsByTagName("student");            System.out.println("----------------------------");            for (int temp = 0; temp < nList.getLength(); temp++) {                Node nNode = nList.item(temp);                System.out.println("\nCurrent Element :"                        + nNode.getNodeName());                if (nNode.getNodeType() == Node.ELEMENT_NODE) {                    Element eElement = (Element) nNode;                    //get attribute                    System.out.println("Student roll no : "                            + eElement.getAttribute("rollno"));                    //get element content                    System.out.println("First Name : "                            + eElement                            .getElementsByTagName("firstname")                            .item(0)                            .getTextContent());                    System.out.println("Marks : "                            + eElement                            .getElementsByTagName("marks")                            .item(0)                            .getTextContent());                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

结果如下:

Root element :class----------------------------Current Element :studentStudent roll no : 393First Name : dinkarMarks : 85Current Element :studentStudent roll no : 493First Name : VaneetMarks : 95Current Element :studentStudent roll no : 593First Name : jasvirMarks : 90
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

XML解析实例二

这里将要解析的input2.txt文件放在项目的根目录下,其内容如下:

<?xml version="1.0"?><cars>   <supercars company="Ferrari">      <carname type="formula one">Ferarri 101</carname>      <carname type="sports car">Ferarri 201</carname>   </supercars>   <supercars company="Lamborgini">      <carname>Lamborgini 001</carname>   </supercars></cars>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
package com.example.xmlparse;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;public class SecondDOMParserDemo {    public static void main(String argv[]) {        try {            File inputFile = new File("input2.txt");            DocumentBuilderFactory dbFactory =                    DocumentBuilderFactory.newInstance();            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();            Document doc = dBuilder.parse(inputFile);            doc.getDocumentElement().normalize();            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());            NodeList nList = doc.getElementsByTagName("supercars");            System.out.println("----------------------------");            for (int temp = 0; temp < nList.getLength(); temp++) {                Node nNode = nList.item(temp);                System.out.print("\nCurrent Element :");                System.out.println(nNode.getNodeName());                if (nNode.getNodeType() == Node.ELEMENT_NODE) {                    Element eElement = (Element) nNode;                    System.out.println("company : " + eElement.getAttribute("company"));                    NodeList carNameList =                            eElement.getElementsByTagName("carname");                    for (int count = 0;                         count < carNameList.getLength(); count++) {                        Node node1 = carNameList.item(count);                        if (node1.getNodeType() ==                                node1.ELEMENT_NODE) {                            Element car = (Element) node1;                            System.out.println("car name : " + car.getTextContent());                            System.out.println("car type : " + car.getAttribute("type"));                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

解析结果如下:

Root element: cars----------------------------Current Element :supercarscompany : Ferraricar name : Ferarri 101car type : formula onecar name : Ferarri 201car type : sports carCurrent Element :supercarscompany : Lamborginicar name : Lamborgini 001car type : 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

创建XML并写入文件实例

源代码如下:

package com.example.xmlparse;import org.w3c.dom.Attr;import org.w3c.dom.Document;import org.w3c.dom.Element;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.File;public class FirstCreateXMLDemo {    public static void main(String argv[]) {        try {            DocumentBuilderFactory dbFactory =                    DocumentBuilderFactory.newInstance();            DocumentBuilder dBuilder =                    dbFactory.newDocumentBuilder();            Document doc = dBuilder.newDocument();            // root element            Element rootElement = doc.createElement("cars");            doc.appendChild(rootElement);            //  supercars element            Element supercar = doc.createElement("supercars");            rootElement.appendChild(supercar);            // setting attribute to element            Attr attr = doc.createAttribute("company");            attr.setValue("Ferrari");            supercar.setAttributeNode(attr);            // carname element            Element carname = doc.createElement("carname");            Attr attrType = doc.createAttribute("type");            attrType.setValue("formula one");            carname.setAttributeNode(attrType);            carname.appendChild(                    doc.createTextNode("Ferrari 101"));            supercar.appendChild(carname);            final Element carname2 = doc.createElement("carname");            carname2.appendChild(                    doc.createTextNode("Ferrari 202"));            supercar.appendChild(carname2);            // write the content into xml file            TransformerFactory transformerFactory =                    TransformerFactory.newInstance();            Transformer transformer =                    transformerFactory.newTransformer();            DOMSource source = new DOMSource(doc);            File file = new File("output.txt");            if (file.exists()) {                file.delete();            }            StreamResult result =                    new StreamResult(new File("output.txt"));            transformer.transform(source, result);            // Output to console for testing            StreamResult consoleResult =                    new StreamResult(System.out);            transformer.transform(source, consoleResult);        } catch (Exception e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

创建的位于项目根目录下的output.txt的内容如下(没有进行格式化):

<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars>    <supercars company="Ferrari">        <carname type="formula one">Ferrari 101</carname>        <carname>Ferrari 202</carname>    </supercars></cars>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

修改XML文件实例

这里使用的位于项目根目录下的output2.txt的文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars>   <supercars company="Ferrari">      <carname type="formula one">Ferrari 101</carname>      <carname type="sports">Ferrari 202</carname>   </supercars>   <luxurycars company="Benteley">      <carname>Benteley 1</carname>      <carname>Benteley 2</carname>      <carname>Benteley 3</carname>   </luxurycars></cars>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

修改代码如下:

package com.example.xmlparse;import org.w3c.dom.*;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.io.File;public class ModifyXmlFileDemo {    public static void main(String argv[]) {        try {            File inputFile = new File("output2.txt");            DocumentBuilderFactory docFactory =                    DocumentBuilderFactory.newInstance();            DocumentBuilder docBuilder =                    docFactory.newDocumentBuilder();            Document doc = docBuilder.parse(inputFile);            Node cars = doc.getFirstChild();            cars.getNextSibling();            cars.getPreviousSibling();            cars.getFirstChild();            cars.getLastChild();            Node supercar = doc.getElementsByTagName("supercars").item(0);            // update supercar attribute            NamedNodeMap attr = supercar.getAttributes();            Node nodeAttr = attr.getNamedItem("company");            nodeAttr.setTextContent("Lamborigini");            // loop the supercar child node            NodeList list = supercar.getChildNodes();            for (int temp = 0; temp < list.getLength(); temp++) {                Node node = list.item(temp);                if (node.getNodeType() == Node.ELEMENT_NODE) {                    Element eElement = (Element) node;                    if ("carname".equals(eElement.getNodeName())) {                        if ("Ferrari 101".equals(eElement.getTextContent())) {                            eElement.setTextContent("Lamborigini 001");                        }                        if ("Ferrari 202".equals(eElement.getTextContent()))                            eElement.setTextContent("Lamborigini 002");                    }                }            }            NodeList childNodes = cars.getChildNodes();            for (int count = 0; count < childNodes.getLength(); count++) {                Node node = childNodes.item(count);                if ("luxurycars".equals(node.getNodeName()))                    cars.removeChild(node);            }            // write the content on console            TransformerFactory transformerFactory =                    TransformerFactory.newInstance();            Transformer transformer = transformerFactory.newTransformer();            DOMSource source = new DOMSource(doc);            System.out.println("-----------Modified File-----------");            StreamResult consoleResult = new StreamResult(System.out);            transformer.transform(source, consoleResult);        } catch (Exception e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

结果如下:

-----------Modified File-----------<?xml version="1.0" encoding="UTF-8" standalone="no"?><cars>   <supercars company="Lamborigini">      <carname type="formula one">Lamborigini 001</carname>      <carname type="sports">Lamborigini 002</carname>   </supercars></cars>
原创粉丝点击