java之DocumentBuilderFactory解析xml

1、About documentBuilderFactory API description

1)、 javax.xml.parsers 包DocumentBuilderFactory創(chuàng)建DOM模式的解析器對象, DocumentBuilderFactory是抽象工廠類,不能直接實(shí)例化,但是有newInstance方法


2)、DocumentBuilderFactory.newInstance() 得到創(chuàng)建 DOM 解析器的工廠


DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance()


3)、newDocumentBuilder方法得到 DOM 解析器對象


DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();



4)、DOM解析器解析輸入流,這里可以是XML,文檔轉(zhuǎn)化為輸入流,或者字符串轉(zhuǎn)為ByteArrayInputStream,DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個(gè)文檔的 Document 對象


    InputStream is = new FileInputStream("xxx.xml");
    documentBuilder.parse(is);
    documentBuilder.parse(new ByteArrayInputStream(str.getBytes()));

 
5)、得到 XML 文檔的根節(jié)點(diǎn)

 
Element rootElement = document.getDocumentElement();


6)、得到節(jié)點(diǎn)的子節(jié)點(diǎn)


NodeList studentInfo = appElement.getChildNodes();


 
2、Test Demo



Student.java文件

    package com.parse.doc;
     
    public class Student {
       
        public String name;
        public String age;
        public String sex;
        public Student() {}
       
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        @Override
        public String toString() {
            return "name=" + name + ", age=" + age + ", sex=" + sex;
        }
    }

ParseXml.java文件

    package com.parse.doc;
     
    import java.io.ByteArrayInputStream;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
     
     
    public class ParseXml {
       
        public static String xml = "<Students><student><name><![CDATA[陳喻]]></name><age><![CDATA[26]]></age><sex><![CDATA[男]]></sex></student><student><name><![CDATA[陳彩鳳]]></name><age><![CDATA[25]]></age><sex><![CDATA[女]]></sex></student><student><name><![CDATA[陳紫宣]]></name><age><![CDATA[2]]></age><sex><![CDATA[女]]></sex></student><student><name><![CDATA[陳紫曦]]></name><age><![CDATA[7個(gè)月]]></age><sex><![CDATA[女]]></sex></student></Students>";
        public static final String STUDENT = "student";
        public static final String NAME = "name";
        public static final String AGE = "age";
        public static final String SEX = "sex";
       
        public static void main(String args[]) {
            List<Student> students = parseXmlByDoc(xml);
            if (students != null && students.size() > 0) {
                for (Student student : students) {
                    System.out.println(student);
                }
            } else {
                System.out.println("students size is 0");
            }
           
        }
       
        public static List<Student> parseXmlByDoc(String str) {
            if (str == null || "".equals(str)) {
                System.out.println("str is null or ''");
                return null;
            }
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            List<Student> students = new ArrayList<Student>();
            DocumentBuilder documentBuilder;
            try {
                documentBuilder = documentBuilderFactory.newDocumentBuilder();
                Document document = documentBuilder.parse(new ByteArrayInputStream(str.getBytes()));
                Element rootElement = document.getDocumentElement();
                NodeList studentNodeList = rootElement.getElementsByTagName(STUDENT);
                for (int i = 0; i < studentNodeList.getLength(); i++) {
                    Element appElement = (Element) studentNodeList.item(i);
                    NodeList studentInfo = appElement.getChildNodes();
                    Student student = new Student();
                    for(int j = 0; j < studentInfo.getLength(); j++) {
                        Element element = (Element) studentInfo.item(j);
                        String appAttr = element.getTagName();
                        switch (appAttr) {
                            case NAME:
                                student.setName(element.getTextContent());
                                break;
                            case AGE:
                                student.setAge(element.getTextContent());
                                break;
                            case SEX:
                                student.setSex(element.getTextContent());
                                break;
                            default:
                                break;
                        }
                    }
                    students.add(student);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return students;
        }
    }


 
3、Running results

 

    name=陳喻, age=26, sex=男
    name=陳彩鳳, age=25, sex=女
    name=陳紫宣, age=2, sex=女
    name=陳紫曦, age=7個(gè)月, sex=女




作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)