zoukankan      html  css  js  c++  java
  • 每天多一点之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("保存成功!");
        }
    }
  • 相关阅读:
    基本数据结构:链表(list)
    字符串函数
    TCHAR
    开源库链接
    视频 链接
    tabbar
    加密
    安全类链接,https
    资本
    审核 -链接 - 发布证书
  • 原文地址:https://www.cnblogs.com/hackerd/p/3098116.html
Copyright © 2011-2022 走看看