javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析)

2024-09-07 16:08

本文主要是介绍javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Jaxp解析开发包

 

  •   JAXP 开发包是J2SE的一部分,它由javax.xmlorg.w3c.domorg.xml.sax 包及其子包组成
  •   在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的DOMSAX 的解析器对象。

 

DOM解析方式:

步骤:

1.        调用javax.xml.parsers 包中DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

2.        调用工厂对象的newDocumentBuilder方法得到 DOM 解析器对象。

3.        调用DOM 解析器对象的parse() 方法解析XML 文档,得到代表整个文档的Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

 

DOM解析器在解析XML文档的时候,会把文档中的所有元素都解析成一个个的对象(包括文本),这些对象都实现了一个共同的接口:Node。

Document中,节点之间关系如下:

  •   位于一个节点之上的节点是该节点的父节点(parent)
  •   一个节点之下的节点是该节点的子节点(children)
  •   同一层次,具有相同父节点的节点是兄弟节点(sibling)
  •   一个节点的下一个层次的节点集合是节点后代(descendant)
  •   父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

 

Node对象提供了一系列常量来代表节点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的具体对象(Node的子类对象),以便于调用其特有的方法。

怕强转错的话,先判断一下这个Node的类型等不等于某个常量。

只有Element才能操作节点的属性。

只有Document可以创建节点,只有父节点能删掉和添加这个节点。增、删、改都只是跟新了内存,还需要将内存中的document跟新到工程中的xml文档中去。

 

更新XML文档:

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如:把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

  •   通过javax.xml.transform.TransformerFactory类获得Transformer对象。
  •   Transformer对象通过transform方法完成转换操作,该方法接收一个来源和一个目的地。我们可以通过:
  •   javax.xml.transform.dom.DOMSource类来关联来源于内存的document对象,
  •   用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。

 

package cn.mengmei.jaxp;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class Demo1 {public static void main(String[] args) throws Exception {//得到工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//得到解析器DocumentBuilder builder = factory.newDocumentBuilder();//解析xml文档,得到Document对象//String path = Demo1.class.getClassLoader().getResource("book.xml").getPath();//System.out.println(path);Document document = builder.parse("src/book.xml");//read(document);//update(document);//add(document);//delete(document);//updateAttribute(document);//list(document);//根节点System.out.println(document.getDocumentElement().getTagName());}//遍历所有节点public static void list(Node node){if(node.getNodeType() == node.ELEMENT_NODE){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();for(int i=0;i<list.getLength();i++){list(list.item(i));}}public static void updateAttribute(Document document) throws Exception {Node node = document.getElementsByTagName("书").item(0);Element ele = null;if(node.getNodeType() == node.ELEMENT_NODE){ //做节点转换之前,最好先判断节点类型。ele = (Element)node;}ele.setAttribute("name", "yyy");//ele.setAttribute("password", "123");//ele.removeAttribute("password");//跟新xml文档TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));}public static void delete(Document document) throws Exception {//得到第二个售价节点Node node = document.getElementsByTagName("售价").item(1);//用这个售价节点的父节点将此节点删掉node.getParentNode().removeChild(node);//将内存跟新到xml文档中TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));}public static void add(Document document) throws Exception {//用document创建一个售价节点Element ele = document.createElement("售价");//为售价节点设置textContentele.setTextContent("59元");//将新建的售价节点 挂到document的书节点 下//document.getElementsByTagName("书").item(0).appendChild(ele);//只跟新了内存document.getElementsByTagName("书").item(0).insertBefore(ele, document.getElementsByTagName("售价").item(0));//将内存中的document跟新到工程中的xml文档中去:TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult("src/book.xml"));}public static void update(Document document) throws Exception {Node node = document.getElementsByTagName("售价").item(0);node.setTextContent("109.00元");                           //只跟新了内存中的值。//把内存中的document写到工程中的xml文档中去://利用javax.xml.transform包中的工厂类得到转换器对象TransformerFactory factory = TransformerFactory.newInstance();Transformer transformer = factory.newTransformer();//将内存中的document转成DOMSourceDOMSource source = new DOMSource(document);//将工程中的xml文件封装到StreamResult中StreamResult result = new StreamResult("src/book.xml");//将source转成resulttransformer.transform(source, result);}public static void read(Document document) {NodeList list = document.getElementsByTagName("售价");Node node = list.item(0);String content = node.getTextContent();System.out.println(content);}}



 

 

 

这篇关于javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145524

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听