每天多一点之DOM解析

1、XML解析分为:dom解析和sax解析

•dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

•sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

2、获得JAXP中的DOM解析器步骤

①调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

②调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

③调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

3、实例代码之读取信息

XML:


<?
xml version="1.0" encoding="UTF-8"?> <Class> <stu id='1'> <name>小猫</name> <age>25</age> </stu> <stu id='2'> <name>小明</name> <age>24</age> </stu> </Class>

crud:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
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;

public class TestXml {
    public static void main(String[] args) {
        try {
            // 创建一个DocumentBuilderFactory
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            // 创建解析器
            DocumentBuilder db = dbf.newDocumentBuilder();
            // 解析文档,得到Document对象
            Document doc = db.parse("class.xml");
            // 遍历
            listDoc(doc);
            listDocValue(doc);
            // 修改
            updateDoc(doc);
            // 删除
            removeDoc(doc);
            // 新增
            addDoc(doc);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // 遍历XML的节点
    private static void listDoc(Node node) {
        // 判断是不是元素节点
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(node.getNodeName());
        }
        // 获取node的子节点
        NodeList nodeList = node.getChildNodes();

        for (int i = 0; i < nodeList.getLength(); i++) {
            listDoc(nodeList.item(i));
        }
    }

    // 遍历每个节点的值
    private static void listDocValue(Document doc) {
        NodeList nodeList = doc.getElementsByTagName("stu");
        Element element = null;
        for (int i = 0; i < nodeList.getLength(); i++) {
            element = (Element) nodeList.item(i);
            System.out.println("学号:" + element.getAttribute("id"));
            System.out.println("姓名:"
                    + element.getElementsByTagName("name").item(0)
                            .getFirstChild().getNodeValue());
            System.out.println("年龄:"
                    + element.getElementsByTagName("age").item(0)
                            .getFirstChild().getNodeValue());
        }
    }

    // 修改第一个学生的姓名
    private static void updateDoc(Document doc) {
        NodeList nodeList = doc.getElementsByTagName("stu");
        Element element = (Element) nodeList.item(0);
        element.getElementsByTagName("name").item(0).setTextContent("小东");
        saveDoc(doc, "class.xml");
    }

    // 删除第一个学生的属性,删除第二个学生
    private static void removeDoc(Document doc) {
        NodeList nodeList = doc.getElementsByTagName("stu");
        Element stu1 = (Element) nodeList.item(0);
        stu1.removeAttribute("id");
        Element element = (Element) nodeList.item(1);
        element.getParentNode().removeChild(element);
        // 保存
        saveDoc(doc, "class.xml");
    }

    // 新增一个学生
    private static void addDoc(Document doc) {
        // 创建节点
        Element stu = doc.createElement("stu");
        Element stu_name = doc.createElement("name");
        Element stu_age = doc.createElement("age");
        // 设置属性、节点值
        stu.setAttribute("id", "3");
        stu_name.setTextContent("小丽");
        stu_age.setTextContent("23");
        // 添加到stu节点
        stu.appendChild(stu_name);
        stu.appendChild(stu_age);
        // 将新学生添加到根节点
        doc.getDocumentElement().appendChild(stu);
        // 保存
        saveDoc(doc, "class.xml");
    }

    // 将cud操作后的结果保存
    private static void saveDoc(Document doc, String path) {
        try {
            // 获取TransformerFactory
            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            transformerFactory.setAttribute("indent-number",2);
            // 获取转换器实例
            Transformer transformer = transformerFactory.newTransformer();
            //格式化,实现缩进
             transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
             transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
            // 存储
            transformer.transform(new DOMSource(doc), new StreamResult(path));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


4、案例:基于xml的学生成绩维护系统:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
    <student sid="001">
        <name>小明</name>
        <course>
            <java>90</java>
            <oracle>90</oracle>
            <vb>89</vb>
        </course>
    </student>
    <student sid="002">
        <name>小李</name>
        <course>
            <java>9</java>
            <oracle>70</oracle>
            <vb>8</vb>
        </course>
    </student>
    <student sid="003">
        <name>小韩</name>
        <course>
            <java>90</java>
            <oracle>70</oracle>
            <vb>85</vb>
        </course>
    </student>
    <student sid="004">
        <name>小明名</name>
        <course>
            <java>34</java>
            <oracle>50</oracle>
            <vb>58</vb>
        </course>
    </student>
    <student sid="005">
        <name>小红</name>
        <course>
            <java>29</java>
            <oracle>39</oracle>
            <vb>88</vb>
        </course>
    </student>
    <student sid="006">
        <name>小米</name>
        <course>
            <java>99</java>
            <oracle>99</oracle>
            <vb>67</vb>
        </course>
    </student>
</students>

CRUD:
package com.exercise.dom;

import java.util.Scanner;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
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.NodeList;

public class DomExercise {
    private Scanner scanner = new Scanner(System.in);
    private Document doc;

    public static void main(String[] args) {

        DomExercise domExercise = new DomExercise();
        domExercise.doc = getDocument();
        domExercise.show();
    }

    public void show() {
        String option = "";
        do {
            System.out.println("查看所有学生的成绩------view");
            System.out.println("按照学生学号查询学生成绩-----query");
            System.out.println("添加一个学生-----add");
            System.out.println("按照学号更改一个学生的信息-----change");
            System.out.println("按照学号去删除一个学生------remove");
            System.out.println("保存学生信息-----save");
            System.out.println("退出系统--------exit");
            System.out.println("请输入你要的操作:");
            option = scanner.next();
            if (option.equals("view")) {
                showAllScores();
            } else if (option.equals("query")) {
                queryById();
            } else if (option.equals("add")) {
                addStu();
            } else if (option.equals("change")) {
                changeInfo();
            } else if (option.equals("remove")) {
                removeStu();
            } else if (option.equals("save")) {
                saveInfo();
            } else if (option.equals("exit")) {
                System.exit(0);
            }
        } while (true);
    }

    // 根据学号 删除学生
    private void removeStu() {
        System.out.println("请输入你要删除的学生的学号:");
        String sid = scanner.next();

        // 获取所有student节点
        NodeList nodeList = doc.getElementsByTagName("student");

        // 删除对应学号的学生
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element element = (Element) nodeList.item(i);
            if (element.getAttribute("sid").equals(sid)) {
                element.getParentNode().removeChild(nodeList.item(i));
                break;
            }
        }
    }

    // 根据学号修改学生信息
    private void changeInfo() {
        System.out.println("请输入你要修改的学生的学号:");
        String sid = scanner.next();
        // 获取所有student节点
        NodeList nodeList = doc.getElementsByTagName("student");
        Element element = null;
        // 遍历获取的所有student节点,获取对应学号的学生信息
        for (int i = 0; i < nodeList.getLength(); i++) {
            element = (Element) nodeList.item(i);
            if (element.getAttribute("sid").equals(sid)) {
                System.out.println("学号=" + element.getAttribute("sid")
                        + "\t\t姓名=" + getElementValue(element, "name")
                        + "\tJava=" + getElementValue(element, "java")
                        + "\tOracle=" + getElementValue(element, "oracle")
                        + "\tVB=" + getElementValue(element, "vb"));
                break;
            }
        }

        System.out.println("修改学号-----1");
        System.out.println("修改姓名-----2");
        System.out.println("修改Java成绩-----3");
        System.out.println("修改Oracle成绩-----4");
        System.out.println("修改VB成绩-----5");
        System.out.println("请选择您要修改的信息:");
        String inStr = scanner.next();
        if (inStr.equals("1")) {
            System.out.println("请输入新学号:");
            String newSid = scanner.next();
            element.setAttribute("sid", newSid);
        } else if (inStr.equals("2")) {
            System.out.println("请输入新姓名:");
            String newName = scanner.next();
            element.getElementsByTagName("name").item(0)
                    .setTextContent(newName);
        } else if (inStr.equals("3")) {
            System.out.println("请输入新Java成绩:");
            String newJava = scanner.next();
            element.getElementsByTagName("java").item(0)
                    .setTextContent(newJava);
        } else if (inStr.equals("4")) {
            System.out.println("请输入新Oracle成绩:");
            String newOracle = scanner.next();
            element.getElementsByTagName("oracle").item(0)
                    .setTextContent(newOracle);
        } else if (inStr.equals("5")) {
            System.out.println("请输入新VB成绩:");
            String newVB = scanner.next();
            element.getElementsByTagName("vb").item(0).setTextContent(newVB);
        }

        System.out.println("修改后:");
        System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名="
                + getElementValue(element, "name") + "\tJava="
                + getElementValue(element, "java") + "\tOracle="
                + getElementValue(element, "oracle") + "\tVB="
                + getElementValue(element, "vb"));
    }

    // 添加学生
    private void addStu() {
        System.out.println("添加一个新学生:");
        System.out.println("请输入学号:");
        String sid = scanner.next();
        System.out.println("请输入姓名:");
        String name = scanner.next();
        System.out.println("请输入java成绩:");
        String javaScore = scanner.next();
        System.out.println("请输入oracle成绩:");
        String oracleScore = scanner.next();
        System.out.println("请输入VB成绩:");
        String vbScore = scanner.next();

        // 创建节点
        Element stu = doc.createElement("student");
        Element stu_name = doc.createElement("name");
        Element stu_course = doc.createElement("course");
        Element stu_java = doc.createElement("java");
        Element stu_oracle = doc.createElement("oracle");
        Element stu_vb = doc.createElement("vb");

        // 设置属性、节点值
        stu.setAttribute("sid", sid);
        stu_name.setTextContent(name);
        stu_java.setTextContent(javaScore);
        stu_oracle.setTextContent(oracleScore);
        stu_vb.setTextContent(vbScore);

        // 添加节点
        stu.appendChild(stu_name);
        stu.appendChild(stu_course);
        stu_course.appendChild(stu_java);
        stu_course.appendChild(stu_oracle);
        stu_course.appendChild(stu_vb);
        // 添加到根节点
        doc.getFirstChild().appendChild(stu);
    }

    // 根据输入的学号查询学生成绩
    private void queryById() {
        System.out.println("请输入学号:");
        String sid = scanner.next();

        // 获取所有student节点
        NodeList nodeList = doc.getElementsByTagName("student");

        // 遍历获取的所有student节点,获取对应学号的学生信息
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element element = (Element) nodeList.item(i);
            if (element.getAttribute("sid").equals(sid)) {
                System.out.println("学号=" + element.getAttribute("sid")
                        + "\t\t姓名=" + getElementValue(element, "name")
                        + "\tJava=" + getElementValue(element, "java")
                        + "\tOracle=" + getElementValue(element, "oracle")
                        + "\tVB=" + getElementValue(element, "vb"));
            }
        }

    }

    // 获取document
    private static Document getDocument() {
        Document doc = null;
        try {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            // 创建解析器
            DocumentBuilder documentBuilder = documentBuilderFactory
                    .newDocumentBuilder();
            // 获取document
            doc = documentBuilder.parse("src/com/exercise/dom/exercise.xml");

        } catch (Exception e) {
            e.printStackTrace();
        }

        return doc;
    }

    // 显示所有学生的成绩
    private void showAllScores() {
        System.out.println("显示所有学生的成绩:");
        // 获取所有的student节点
        NodeList nodeList = doc.getElementsByTagName("student");

        // 遍历获取的所有student节点下的信息
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element element = (Element) nodeList.item(i);
            System.out.println("学号=" + element.getAttribute("sid") + "\t\t姓名="
                    + getElementValue(element, "name") + "\tJava="
                    + getElementValue(element, "java") + "\tOracle="
                    + getElementValue(element, "oracle") + "\tVB="
                    + getElementValue(element, "vb"));
        }
    }

    // 获取element的信息
    private String getElementValue(Element element, String tagName) {
        return element.getElementsByTagName(tagName).item(0).getTextContent();
    }

    // 保存学生信息
    private void saveInfo() {
        try {
            // 创建TransformerFactory
            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            // 创建转换器
            Transformer transformer = transformerFactory.newTransformer();
            // 格式化,实现缩进
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(
                    "{http://xml.apache.org/xalan}indent-amount", "2");
            // 转换
            transformer.transform(new DOMSource(doc), new StreamResult(
                    "src/com/exercise/dom/exercise.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("保存成功!");
    }
}
posted @ 2013-05-24 23:33  HackerD  阅读(196)  评论(0编辑  收藏  举报