Java 4:XML -DOM

解析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"?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容