美文网首页
Java 4:XML -DOM

Java 4:XML -DOM

作者: 老柯南 | 来源:发表于2019-03-31 11:48 被阅读0次

    解析XML
    DOM(Java提供) (整个文件加载到内存中去执行解析)
    SAX(Javat提供)
    DOM4J
    JDOM

    DOM解析
    1:创建DocumentBuilderFactory
    2:创建DocumentBuilder对象
    3:使用DocumentBuilder对象parse xml文件 ,得到Document对象;

    image.png

    上面给出的是Node下定义的3种类型,Node定义的类型不止这3种,一共有12种;

    DOM解析XML:

    XML 是一个树形数据结构,DOM解析下的XML分别由Element,Attr等构成,上面的3个类分别实现了Node接口,注意:xml 中认为#text内容也是一个子节点;Document为整个文件;

    <?xml version="1.0" encoding="UTF-8"?>
    <bookstore>
        <book id="1" idd = "2222">
            <name>全力的优秀</name>
            <author>conan</author>
            <year>2014</year>
            <price>89</price>
        </book>
        <book id="2">
            <name>悟空</name>
            <year>2004</year>
            <price>77</price>
            <language>English</language>
        </book>
    </bookstore>
    

    1 DOM 解析XML 准备工作

    通过准备工作,解析到指定xml文件的Document对象(xml的root node);

     // 创建DocumentBuilderFactory对象
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     // 创建DocumentBuilder对象
                DocumentBuilder documentBuilder = factory.newDocumentBuilder();
     //解析xml对象
                Document document = documentBuilder.parse("books.xml");
    
    

    2 使用DOM解析xml文件获取Root node的信息

     Element documentElement = document.getDocumentElement();
    

    3 使用DOM解析xml文件:解析Document下的Element

    //首先获取Document下的子节点 这里好像不能不知道名字的情况下获取所有的子节点;
    //getElementById:Element  getElementsByTagName:NodeList getElementsByTagNameNS:NodeList
    NodeList books = document.getElementsByTagName("book");
    Element book = (Element) books.item(i);
    
    //获取节点名 getFirstChild() 是因为:#text 也是一个字节点
    book.getFirstChild().getNodeValue();
    //获取节点值
    book.getFirstChild().getNodeName(); 
    //获取节点类型
    book.getFirstChild().getNodeType();  //用于过滤#text 
    

    4 使用DOM解析xml文件的属性名和属性值:解析Element的属性Attr

    // public NamedNodeMap getAttributes(); (Node类下)
    // public Attr getAttributeNode(String name);  (Element下的)
    // 获取所有的属性Attr
    NamedNodeMap attributes = book.getAttributes();
    // 如果知道属性id 可以直接获取属性的值
     String id = book.getAttribute("id");
    

    5 修改,保存XML

    使用DOM 修改XML ,需要先准备好子节点,最终在appendChild 到root node上去;这些操作都只发生在内存上, 并不会真正的写入到文件;
    如果需要保存到文件,需要借助TransformerFactory#newTransformer保存到硬盘;

     //构造保存方法的lambda表达式,传入根节点、路径文件
                BiConsumer<Node, String> saveDomTree = (root, strPath) -> {
                    try {
                        //【保存】1、创建转换工厂
                        TransformerFactory tff = TransformerFactory.newInstance();
                        //【保存】2、创建转换器
                        Transformer tf = tff.newTransformer();
                        //【保存】3、设置转换器,会根据标签自动添加不同的声明,XML<?xml?>,HTML<META>
                        tf.setOutputProperty(OutputKeys.VERSION, "1.0");
                        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                        //【保存】4、获取数据源
                        DOMSource doms = new DOMSource(root);
                        //【保存】5、设置保存位置,已经存在的文件被覆盖,不存在自动创建
                        StreamResult sr = new StreamResult(strPath);
                        //【保存】6、执行
                        tf.transform(doms, sr);
                    } catch (TransformerException e) {
                        e.printStackTrace();
                    }
                };
     saveDomTree.accept(documentElement, "books2.xml");
    
    
    注意: 设置转换器信息 <?xml version="1.0" encoding="UTF-8"?>

    相关文章

      网友评论

          本文标题:Java 4:XML -DOM

          本文链接:https://www.haomeiwen.com/subject/pdzjbqtx.html