XML解析---JAVAEE学习之路

解析XML通过JAXP的DOM(DEMO)

废话不多说,自行测试跟看1.6以上的JDK API
目录结构:
这里写图片描述
XML文件内容:
这里写图片描述

XML代码:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
    <书 批发价="30">
        <书名>java编程思想</书名>
        <作者>James</作者>
        <价格>89</价格>
    </书>
    <书>
        <书名>C Primer</书名>
        <作者>JJ</作者>
        <价格>30</价格>
    </书>
</书架>

代码块:

package com.csa.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 org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main {
    public static void main(String[] args) throws Exception {
        //从Document工厂生产一个Burilder
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        //通过parse()方法获取一个对象
        Document document = documentBuilder.parse("src/Book.xml");
        //getContentByNameAndIndex(document, "书名", 2);
        //printByNode(document, -1);
        //setContentByNodeAndIndex(document, "价格", 2, "30");
        //insertNewToNodeBefore(document, "书名", 1, createNode(document, "批发价", "20"), false);
        //appendChildToParent(document, "书", 1, createNode(document, "批发价", "20"));
        //removeNodeByName(document, "批发价", 1);
        //opElementByDom(document, "书", 1, "id", "1");
    }

    /**
     * 获得某个具体的节点内容,通过标签名字跟位置
     * @param dom Document对象
     * @param name 查找的标签名字
     * @param index 第几个标签
     */
    private static void getContentByNameAndIndex(Document dom, String name, int index){
        Node item = dom.getElementsByTagName(name).item(index-1);
        System.out.println(item.getTextContent());
    }

    /**
     * 遍历所有节点
     * @param node 要遍历的节点
     * @param hi 深度
     */
    private static void printByNode(Node node, int hi){
        if(node.getNodeType()==Node.ELEMENT_NODE){
            for(int i=0;i<hi;i++){
                System.out.printf("\t");
            }
            System.out.println(node.getNodeName());
        }
        NodeList childNodes = node.getChildNodes();
        for(int i=0;i<childNodes.getLength();i++){
            printByNode(childNodes.item(i), hi+1);
        }
    }

    /**
     * 修改某个元素节点内容
     * @param dom document对象
     * @param name 标签名字
     * @param index 位置
     * @param replace 替换内容
     */
    private static void setContentByNodeAndIndex(Document dom, String name, int index, String replace) throws Exception{
        dom.getElementsByTagName(name).item(index-1).setTextContent(replace);
        //获取transform对象
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        //将更改过的dom写到原来的xml里面
        transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
    }

    /**
     * 创建一个节点
     * @param dom document对象
     * @param nodename 节点名字
     * @param content 节点内容
     * @return 一个节点对象
     */
    private static Node createNode(Document dom, String nodename, String content){
        Node node = dom.createElement(nodename);
        node.setTextContent(content);
        return node;
    }

    /**
     * 向指定元素节点中添加子元素节点
     * @param dom document对象
     * @param parent 父节点名字
     * @param index 第几个父节点
     * @param newnode 孩子节点
     */
    private static void appendChildToParent(Document dom, String parent, int index, Node newnode) throws Exception{
        Node item = dom.getElementsByTagName(parent).item(index-1);
        item.appendChild(newnode);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
    }

    /**
     * 向指定元素节点上增加同级元素节点
     * @param dom document对象
     * @param nodename 节点名字
     * @param index 位置
     * @param newnode 兄弟节点
     * @param isbefore 插入在节点之前则true
     */
    private static void insertNewToNodeBefore(Document dom, String nodename, int index, Node newnode, boolean isbefore) throws Exception{
        Node item = dom.getElementsByTagName(nodename).item(index-1);
        if(isbefore)
            item.getParentNode().insertBefore(newnode, item);
        else
            item.getParentNode().insertBefore(newnode, item.getNextSibling());
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
    }

    /**
     * 删除指定元素节点
     * @param dom document对象
     * @param name 删除的节点名字
     * @param index 位置
     */
    private static void removeNodeByName(Document dom, String name, int index) throws Exception{
        Node item = dom.getElementsByTagName(name).item(index-1);
        item.getParentNode().removeChild(item);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
    }

    /**
     * 操作XML文件属性
     * @param dom document对象
     * @param tagname 标签名字
     * @param index 位置
     * @param key 属性
     * @param value 属性值
     */
    private static void opElementByDom(Document dom, String tagname, int index, String key, String value) throws Exception{
        Node item = dom.getElementsByTagName(tagname).item(index-1);
        Element elem = (Element)item;
        elem.setAttribute(key, value);
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(dom), new StreamResult(dom.getBaseURI()));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37340753/article/details/80766246
今日推荐