首页 > 其他分享 >XML解析之DOM解析

XML解析之DOM解析

时间:2023-05-24 09:44:48浏览次数:55  
标签:XML DOM 步骤 dependency 获取 解析 节点 属性

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();
        }
    }

标签:XML,DOM,步骤,dependency,获取,解析,节点,属性
From: https://www.cnblogs.com/jundong2177/p/17427126.html

相关文章

  • 解析 Pinia 和 Vuex
     Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5,只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。本文将通过Vue3的形式对两者的不同实现方式进行对比,让你在以后工作中无论使用到Pinia还是Vuex的时候都能够游刃有余。既然我们要对比两者的实现......
  • dom、js原生常用api, 兼容ie等主流浏览器(持续更新)
    开发组件库必须知道的东西/***获取scrollTop*@param{HTMLElement|window}element-dom元素或者window对象*@returns{number}*/functiongetScrollTop(element){if(element===window){returnwindow.pageYOffset||document.documentElemen......
  • 编写javaweb用到的基本依赖,mybatis-config.xml代码,SqlSessionFactoryUtils.java
    这篇文章仅仅作为记录,供以后复制粘贴使用pom.xml<dependencies><!--Servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</vers......
  • 【linux基础】ftok函数解析
    前言最新项目代码有关信号量、共享内存,直接使用数值,不能得到预想的效果,调试发现不能直接使用数值,而是ftok函数获取键值,此前不了解,故记录之。原理共享内存、消息队列、信号量都是通过一个中间介质来进行通信的,这种介质多的是。就是怎么区分出来,就像唯一一个身份证来区分人一样。......
  • RAW8图像数据格式解析
    前言使用7yuv工具查看raw8图像数据,选择的格式是8bpp格式,大小是图像尺寸1280*720即可;RAW格式raw数据是sensor输出的原始数据,一般有raw8,raw10,raw12等,分别表示一个像素点有8bit、10bit、12bit数据。是sensor将光信号转化为电信号时的电平高低的原始记录,单纯地没有进行任何处......
  • python生成13位或16位时间戳以及反向解析时间戳
    importdatetimeimporttimedefget_float_time_stamp():datetime_now=datetime.datetime.now()returndatetime_now.timestamp()defget_time_stamp16():#生成16时间戳eg:1540281250399895-lndatetime_now=datetime.datetime.now()print(datetim......
  • Rails:从URL解析路由信息
    ###在Rails3中,您可以执行以下操作:Rails.application.routes.recognize_path"/accounts/1"#{:action=>"show",:controller=>"accounts",:id=>"1"}ActionController::Routing::Routes.recognize_path("/accounts/1&q......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......
  • 将dom转化为图片和批量下载
    利用html2canvas和jszip第三方库importhtml2canvasfrom'html2canvas'importjszipfrom'jszip'具体实现:downloadAll(){this.loading=truelet_this=thisconststations=document.getElementsByClassName('station_b......
  • (二)Spring源码解析:默认标签解析
    一、概述还记得我们在上一讲末尾提到的关于默认标签解析和自定义标签解析吧。本讲就来针对默认标签解析进行讲解。为了便于衔接上一讲的内容,我们将源码部分粘贴出来:从上图中的源码中,我们可以看出默认标签的解析是在parseDefaultElement(ele,delegate)方法中实现的。我们来看一下这......