XML 解析(下)

XML常见的解析方式

  1. DOM(文档对象模型)
    取出.xml文件中的信息
public class StudentManager {
    static Document document;
    static String Path = "src\\com\\etc\\student.xml";
    static {
        // 1、创建解析器工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;
        // 2、根据解析器工厂获得解析器对象
        try {
            db = dbf.newDocumentBuilder();
            // 3、加载XML文档,形成Document对象
            document = db.parse(Path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void show() {
        NodeList list = document.getElementsByTagName("student");// 取出所有的Student子节点
        System.out.println("一共有:" + list.getLength() + "位学生");

        for (int i = 0; i < list.getLength(); i++) {
            Node node = list.item(i);
            //取节点的属性值必须要转换成ELement对象
            Element e = (Element) node;
            System.out.println("学号:" + e.getAttribute("id"));
            // 循环取Student节点下的子节点
            for (Node n = node.getFirstChild(); n != null; n = n.getNextSibling()) {
                if (n.getNodeType() == node.ELEMENT_NODE)// 判断是不是元素节点
                {
                    if (!n.getNodeName().equals("scores")) {
                        if (n.getNodeName().equals("name")) {
                            System.out.println("姓名:"
                                    + n.getFirstChild().getNodeValue());

                        } else if (n.getNodeName().equals("sex")) {
                            System.out.println("性别:"
                                    + n.getFirstChild().getNodeValue());
                        } else if (n.getNodeName().equals("age")) {
                            System.out.println("年龄:"
                                    + n.getFirstChild().getNodeValue());
                        } else if (n.getNodeName().equals("phone")) {
                            System.out.println("电话:"
                                    + n.getFirstChild().getNodeValue());

                        }
                    } else {// 取出成绩
                        System.out.println("成绩如下:");
                        for (Node scNode = n.getFirstChild(); scNode != null; scNode = scNode
                                .getNextSibling()) {
                            if (scNode.getNodeType() == scNode.ELEMENT_NODE)
                                System.out.println(scNode.getFirstChild()
                                        .getNodeValue());
                        }
                        System.out.println("=============");
                    }
                }
            }
        }

    }

往.xml文件中添加信息

public void add() {
        String name = "王锤锤";
        String id = "04";
        String sex = "女";
        String age = "12";
        String phone = "12323423423";
        // 创建Student节点
        Element studentElement = document.createElement("student");
        Attr idAttr = document.createAttribute("id");// 创建ID属性
        idAttr.setValue(id);// 给ID属性赋值ֵ
        studentElement.setAttributeNode(idAttr);// 把ID属性加入到Student节点中

        Element e1 = document.createElement("name");// 创建name节点
        e1.setTextContent(name);// 给节点设置数据
        studentElement.appendChild(e1);// 把ID属性加入到Student节点中

        e1 = document.createElement("sex");// 创建sex节点
        e1.setTextContent(sex);// 给节点设置数据
        studentElement.appendChild(e1);//把sex属性加入到Student节点中

        e1 = document.createElement("age");// 创建age节点
        e1.setTextContent(age);// 给节点设置数据
        studentElement.appendChild(e1);// 把age属性加入到Student节点中

        e1 = document.createElement("phone");// 创建phone节点
        e1.setTextContent(phone);// 给节点设置数据
        studentElement.appendChild(e1);//把phone属性加入到Student节点中

        // 取跟节点
        Element root = document.getDocumentElement();
        root.appendChild(studentElement);// 把Student节点加入根节点的子节点中
        /*save();*/

        //更新XML文档
        TransformerFactory tff = TransformerFactory.newInstance();
        try {
                Transformer tf = tff.newTransformer();
                DOMSource domSource = new DOMSource(document);
                StreamResult ss = new StreamResult(Path);
                tf.transform(domSource, ss);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

删除.XML文件节点信息

public void delete() {
        String id = "04";

        // 取所有Student节点集合
        NodeList list = document.getElementsByTagName("student");
        // 循环每一个Student节点
        for (int i = 0; i < list.getLength(); i++) {
            Node n = list.item(i);
            Element e = (Element) n;// 取节点的ID属性值ֵ
            String idString = e.getAttribute("id");
            if (idString.equals(id)) {
                // 删除节点,方法是:取当前节点的父节点,根据父节点来一处子节点
                n.getParentNode().removeChild(n);
                break;
            }
        }
        save();
    }

更新.XML文件信息

public void update() {
        String id = "04";
        String name = "王大锤";
        String sex = "男";
        // 取所有Student节点集合
        NodeList list = document.getElementsByTagName("student");
        // 循环每一个Student节点
        for (int i = 0; i < list.getLength(); i++) {
            Node n = list.item(i);
            Element e = (Element) n;// 取节点的ID属性值ֵ
            String idString = e.getAttribute("id");
            if (idString.equals(id)) {//判断是否要进行更新的节点
                // 改节点中某个子节点的内容
                for (Node node = n.getFirstChild(); node != null; node = node.getNextSibling()) {
                    if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals("name")) {

                        node.getFirstChild().setTextContent(name);
                    } else if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals("sex")) {
                            node.getFirstChild().setTextContent(sex);
                    }
                }
                break;
            }
        }
        save();
    }

    public void save() {
        //更新XML文档
        TransformerFactory tff = TransformerFactory.newInstance();
        try {
            Transformer tf = tff.newTransformer();
            DOMSource domSource = new DOMSource(document);
            StreamResult ss = new StreamResult(Path);
            tf.transform(domSource, ss);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

DOM4J
DOM4J:非常优秀的Java XML API性能优异。功能强大开放源代码

public class Dom4j1 {
    static String Path = "src\\com\\etc\\student.xml";
    static Document document = null;
    static  {
        SAXReader saxReader = new SAXReader();
        try {
            document =  saxReader.read(new File(Path));
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    public void show(){

        // 取根节点
        Element root = document.getRootElement();
        // 取节点下的所有子节点:Student
        List<Element> list = root.elements();
        for (Element element : list) {
            System.out.println("学号:" + element.attribute("id").getValue());
            // 取student节点中的所以子节点
            List<Element> elements = element.elements();
            for (Element element2 : elements) {
                if (!element2.getName().equals("scores")) {
                    System.out.println(element2.getName() + " : "
                            + element2.getText());
                } else {
                    System.out.println("成绩为:");
                    List<Element> scores = element2.elements();
                    for (Element e : scores) {
                        System.out.println(e.getText());
                    }
                    System.out.println();
                }
            }
            System.out.println("=======");
        }
    }

    public void add(){
        String name = "孙晓晓";
        String id= "05";
        String sex="女";
        String age = "13";
        String phone = "23423454323";

        //根节点
        Element root = document.getRootElement();
        //为根节点添加子节点,并且获得刚刚添加的节点对象
        Element student = root.addElement("student");
        student.addAttribute("id", id);//为Student节点添加属性

        student.addElement("name").setText(name);
        student.addElement("sex").setText(sex);
        student.addElement("age").setText(age);
        student.addElement("phone").setText(phone);

        save();

    }

    public void delete(){

        String id= "05";

        Element root = document.getRootElement();
        //取节点下的所有子节点:Student
        List<Element> list =  root.elements();
        for(int i = 0; i<list.size();i++){
            Element element2 = (Element)list.get(i);
            String idString = element2.attributeValue("id");
            if(idString.equals(id)){
                root.remove(element2);
            }
        }

        save();
    }

    public void update(){
        String id = "05";
        String name = "孙大大";
        String sex = "男";
        Element root = document.getRootElement();
        //取节点下的所有子节点:Student
        List<Element> list =  root.elements();
        for(Element e:list){
            if(e.attribute("id").getValue().equals(id)){
                e.element("name").setText(name);
                e.element("sex").setText(sex);
            }
        }
    }
    public void save(){
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        XMLWriter writer = null;
        try {
            writer = new XMLWriter(new FileWriter(Path),format);
            writer.write(document);

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值