XML解析之DOM解析

XML解析之DOM解析

XML 结构是一种树型结构,处理步骤都差不多,Java 己经将它们封装成了现成的类库。目前流行的解析方法有三种,分别为 DOM、SAX 和 DOM4j。

本文将讲解DOM解析。

DOM(Document Object Model,文档对象模型)

是 W3C 组织推荐的处理 XML 的一种方式。它是一种基于对象的 API,把 XML 的内容加载到内存中,生成一个 XML 文档相对应的对象模型,根据对象模型,以树节点的方式对文档进行操作。下面用实例说明解析步骤。

1、xml文件

本文将采用的是Maven项目中的pom.xml,读者可以自己随便找一个xml文件即可。(懒得找)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>Maven01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.27</version>
    </dependency>
  </dependencies>
</project>

2、DOM解析步骤

步骤一:使用 org.w3c.dom 库中的 newInstance()方法创建一个DocumentBuilderFactory对象

步骤2:使用newDocumentBuilder()方法创建一个DocumentBuilder对象

步骤3:使用parser()方法加载books.xml文件到当前项目

步骤4:使用getElementsByTagName("dependency")获取dependency节点,返回NodeList节点集合对象

步骤5:获取节点dependency的属性名,属性值

1)首先,遍历每一个dependency节点。

① 通过nodeList的getLength()方法可以获取根节点集合dependencyList的长度

② 使用for循环遍历节点集合中的每一个dependency节点

2)然后获取每一个dependency节点的属性名和属性值,这时候有两种方式

方式一:不知道dependency节点有哪些属性时候,用以下方法

①使用item()的方法获取一个dependency节点的具体属性,返回Node类型

②使用getAttributes()获取dependency节点的所有属性集合,返回NamedNodeMap类型

③通过attrs的getLength()方法可以获取属性集合的长度

④使用for循环遍历一个dependency节点的属性

⑤使用item()方法获取dependencys节点属性集合中的每一个属性,返回Node类型

⑥使用getNodeName()方法获取属性的属性名

⑦使用getNodeValue()方法获取属性的属性值

方式二:知道dependency节点只有id一个属性的时候,用以下方法

①将dependency节点进行强制类型转换,转换成Element类型

②通过getAttribute("id")获取属性值

步骤6:获取dependency节点的子节点的节点名和节点值

节点类型 NodeType Named Constant nodename的返回值 nodeValue的返回值
Element 1 ELEMENT_NODE element name null
Attr 2 ATTRIBUTE_NODE 属性名称 属性值
Text 3 TEXT_NODE #text 节点内容

3、DOM解析代码实现

@Test
    public void test2(){
        //步骤1:使用org.w3c.dom库的newInstance()方法创建一个DocumentBuilderFactory对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //步骤2:使用newDocumentBuilder()方法创建一个DocumentBuilder对象
            DocumentBuilder db = dbf.newDocumentBuilder();
            //步骤3:使用parse()方法加载pom.xml文件到当前项目
            Document document = db.parse("D:\\itheima\\SJT230Maven\\pom.xml");
            //步骤4:使用getElementsByTagName("dependency")获取dependency节点,返回的是NodeList对象,也就是节点集合(dependency不止一个)
            NodeList dependencyList = document.getElementsByTagName("dependency");
            //步骤5:获取节点dependency的属性名,属性值
            //首先,遍历每一个dependency节点
            //通过nodeList的getLength()方法可以获取dependencyList的长度
            //1)通过nodeList的getLength()方法可以获取根节点集合dependencyList的长度
            System.out.println("一共有"+dependencyList.getLength()+"个依赖");
            //遍历每一个dependency节点
            for (int i=0;i<dependencyList.getLength();i++) {
                System.out.println("=======下面开始遍历"+(i+1)+"个依赖的内容=======");

                //①使用item()的方法获取一个book节点的具体属性,返回Node类型
                Node dependency = dependencyList.item(i);
                //②使用getAttributes()获取dependency节点的所有属性集合,返回NamedNodeMap类型
                NamedNodeMap attrs = dependency.getAttributes();
                //③通过attrs的getLength()方法可以获取属性集合的长度
                System.out.println("第"+(i+1)+"个依赖共有"+attrs.getLength()+"个属性");
                //④使用for循环遍历一个dependency节点的属性
                for(int j=0;j<attrs.getLength();j++ ) {
                    //⑤使用item()方法获取books节点属性集合中的每一个属性,返回Node类型
                    Node attr = attrs.item(j);
                    //使用getNodeName()方法获取属性的属性名
                    System.out.println("属性名"+ attr.getNodeName()+"的属性值是"+attr.getNodeValue());
                }

                //步骤6:获取dependency节点的子节点的节点名和节点值
                //1)使用getChildNodes()方法获取dependency节点的所有子节点(子节点集合)
                NodeList childNodes = book.getChildNodes();
                //2)遍历getChildNodes获取每个节点的节点名和节点值(节点数是包括空格和换行符)
                System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
                for(int k=0;k<childNodes.getLength();k++ ) {
                    //①由于节点数是包括空格和换行符的,所以要把TEXT_NODE以及ELEMENT_NODE区分开来,
                    //此处使用判断语句,只选择ELEMENT_NODE
                    if (childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
                        //②通过.item(k).getNodeName()方法获取book每一个子节点的节点名
                        System.out.print("第"+(k+1)+"个节点的节点名:"+ childNodes.item(k).getNodeName());
                        System.out.println("的节点值是:"+ childNodes.item(k).getFirstChild().getNodeValue());
                    }
                }
                System.out.println("=======结束遍历"+(i+1)+"个依赖的内容=======");
            }
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (org.xml.sax.SAXException e) {
            e.printStackTrace();
        }
    }
posted @ 2023-05-24 09:38  戒爱学Java  阅读(126)  评论(0编辑  收藏  举报