• DOM解析XML


    DOM

    DOM (Document Object Model,文档对象模型)定义了访问和操作文档的标准方法。

    DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。

    软件包 org.w3c.dom

    为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。

    文档对象

    Node接口

    该 Node 接口是整个文档对象模型的主要数据类型,文档对象模型都继承了这个接口。它表示该文档树中的单个节点。

    在解析XML文件时,注释,换行符、空格和TAB空白符号、元素、文本都是节点。

    nodeName、nodeValue 和 attributes 作为一种获取节点信息的机制

    Interface

    nodeName

    nodeValue

    attributes

    Element

    与 Element.tagName 相同

    null

    NamedNodeMap

    Document

    "#document"

    null

    null

    Text

    "#text"

    与 CharacterData.data 相同,该文本节点的内容

    null

    Attr

    与 Attr.name 相同

    与 Attr.value 相同

    null

    Comment

    "#comment"

    与 CharacterData.data 相同,该注释的内容

    null

    Document对象

    Document对象就是一颗"树",由实现了Node接口的类的实例组成的树形结构数据。XML文件中根标记和Document对象中的根节点相同。Document对象调用getDocumentElement()方法返回root节点。

    Element节点

    Element节点常用的方法:

    String getTagName();//返回标记的名字
    STring getTextContext();//返回当前阶段的所有Text子孙节点中的文本内容,包括空白符号(Tab、空格、换行等)。
    String getAttribute(String name);
    NodeList getElementByTagName(String name);//返回一个NodeList对象,该对象由当前节点的子节点组成。
    boolean hasAttribute(String name);

    得到Document对象

    导入相关支持类,JDK提供的以Document命名的类还是很多的,注意用的下面类就好

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;

    通过如下方式获得一个document对象

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file=new File("E://test.xml");
    Document document=builder.parse(file);

    遍历

    我们要对test.xml文件遍历,首先从根节点开始,获取其子节点集合,然后对每个子节点的子节点进行遍历

    test.xml

    <?xml version="10" encoding="UTF-8" ?>
    <列车时刻表>
        <T28>
            <开车时间>20点58分</开车时间>
            <终到时间>08点18分</终到时间>
        </T28>
        <T876>
            <开车时间>23点12分</开车时间>
            <终到时间>07点18分</终到时间>
        </T876>
    </列车时刻表>

    遍历方法

    public static void traverseXML(Document document){
        Element root = document.getDocumentElement();
        NodeList nodeList = root.getChildNodes();//返回一个NodeList对象,该对象由当前节点的子节点组成。
        if (null != root) {
            //遍历子节点 
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node child = nodeList.item(i);
                //过滤掉不需要的text节点,比如空白符号、注释等
                if (child.getNodeType() == Node.ELEMENT_NODE) {
                    String name = child.getNodeName();
                    System.out.println(name);
                    //遍历孙子节点,与上面通过getChildNodes()来遍历不同,这种方式更方便
                    for (Node node = child.getFirstChild(); node != null; node = node.getNextSibling()) {
                        if (node.getNodeType() == Node.ELEMENT_NODE) {
                            //打印出节点的名字、此节点及其后代的文本内容。
                            System.out.println(node.getNodeName()+"	"+node.getTextContent());
                        }
                    }
                }
            }
        }
    }

    遍历test.xml,结果如下

    T28
    开车时间    20点58分
    终到时间    08点18分
    T876
    开车时间    23点12分
    终到时间    07点18分

    查找

    查找方法

        public static void seek(String tagName, Document document) {
            Element root = document.getDocumentElement();
            // 获取指定名字中的第一个Element对象
            Node target = root.getElementsByTagName(tagName).item(0);
            for (Node node = target.getFirstChild(); null != node; node = node
                    .getNextSibling()) {
                // 过滤掉不需要的text节点,比如空白符号、注释等
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println(node.getNodeName());
                    System.out.println(node.getTextContent());
                }
            }
        }


    查找test.xml中tagName为T876的元素,结果为

    T876
    开车时间23点12分
    终到时间07点18分
  • 相关阅读:
    查询datatime类型
    ms的题目,无聊不妨看看
    读取客户端收藏夹资料的问题
    delphi中的DBGrid无法刷新数据
    jsp与javascript
    .net2.0 web site中的cs文件怎么编译为dll
    由传奇木马引起的遐想
    com组件的调用
    Crystal Report的奇怪问题
    算法导论15章LCS实现(c++)
  • 原文地址:https://www.cnblogs.com/klguang/p/4750666.html
Copyright © 2020-2023  润新知