使用JAXP对XML文档进行DOM解析

一、XML解析方式分为两种:dom和sax

  • dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式。
  • sax:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。

dom和sax解析方法的区别:

  • dom:对文档CRUD(增删改查)比较方便,缺点:占用内存比较大(将xml文件全部读入内存)。
  • sax:占用内存较少,解析速度快(从上往下读一行解析一行)。缺点:只适合读取,不适合CRUD。

XML解析开发包:Jaxp(sun)、Jdom、dom4j

今天学习Jaxp:

二、使用JAXP对XML文档进行DOM解析:

 

private static String filename="src/exam.xml"; public static Document getDocument() throws Exception{//1创建工厂DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();//2得到dom解析器对象DocumentBuilder builder=factory.newDocumentBuilder();//3解析xml文档,得到代表文档的documentreturn builder.parse(filename);}

更加形象的描述为下图:

增,删,改 需要将更新后的内容在写到xml中

public static void writeXml(Document document) throws TransformerException{TransformerFactory factory=TransformerFactory.newInstance();Transformer tf=factory.newTransformer();//transform(Source xmlSource, Result outputTarget)tf.transform(new DOMSource(document), new StreamResult(filename) );}

三、实战演练:

books.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书><书名 name="xxx">影响力</书名><作者>罗伯特.西奥迪尼</作者><售价>90</售价></书><书><书名>JavaScript</书名><作者>JS</作者><售价>45</售价></书>
</书架>

读取XML文件,JUnit测试:

@Testpublic  void read() throws ParserConfigurationException, SAXException, IOException {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document document=builder.parse("src/books.xml");NodeList list= document.getElementsByTagName("书名");Node node= list.item(0);String content=node.getTextContent();System.out.println(content);}

递归遍历XML文件中的所有节点

    @Testpublic  void read1() throws ParserConfigurationException, SAXException, IOException {DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document document=builder.parse("src/books.xml");Node root=document.getElementsByTagName("书架").item(0);list(root);        }/** 递归遍历XML文件中的所有节点* */public  void list(Node node){if(node instanceof Element){System.out.println(node.getNodeName());}NodeList childs= node.getChildNodes();for(int i=0;i<childs.getLength();i++){Node child=childs.item(i);list(child);}}

添加节点到XML文件中:

    @Testpublic  void add() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document document=builder.parse("src/books.xml");Element price=document.createElement("售价");//创建节点//把创建的节点添加到第一本书price.setTextContent("90");Element book=(Element) document.getElementsByTagName("书").item(0);book.appendChild(price);//把更新后的文档TransformerFactory tfactory=TransformerFactory.newInstance();Transformer tf=tfactory.newTransformer();tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));}

为标签添加属性:

    @Testpublic  void addAttr() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document document=builder.parse("src/books.xml");Element bookname=(Element) document.getElementsByTagName("书名").item(0);bookname.setAttribute("name", "xxx");//把更新后的文档TransformerFactory tfactory=TransformerFactory.newInstance();Transformer tf=tfactory.newTransformer();tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));}

删除操作:

@Testpublic  void delete() throws ParserConfigurationException, SAXException, IOException, TransformerException{DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=factory.newDocumentBuilder();Document document=builder.parse("src/books.xml");Element bookname=(Element) document.getElementsByTagName("售价").item(0);//把更新后的文档Element e=(Element) document.getElementsByTagName("书").item(0);e.removeChild(bookname);TransformerFactory tfactory=TransformerFactory.newInstance();Transformer tf=tfactory.newTransformer();tf.transform(new DOMSource(document), new StreamResult("src/books.xml"));}

快乐学习,轻松掌握!

 

转载于:https://www.cnblogs.com/lyjs/p/4858814.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tfpose与openpose区别_人体姿态识别--Openpose+Tensorflow

目的复现代码完成视频中的人体姿态识别复现过程视频来源&#xff1a;https://www.youtube.com/watch?vcMhWNGBW1Xg​www.youtube.com视频动图检测结果下载的画质本来就不高&#xff0c;再加上两次录屏&#xff0c;画质比较渣。首先确认工程所需要的依赖&#xff1a;python3ten…

让 步( 写的太好了!)

一个不懂得为亲人让步&#xff0c;为朋友让步&#xff0c;为爱人让步&#xff0c;为合作伙伴让步的人&#xff0c;是缺乏胸襟的人&#xff0c;最无能和不可交的人。试问一个连自己人都斤斤计较的人可交往吗&#xff01;长不大的人最重要的标志&#xff0c;就是跟自己人&#xf…

Android学习手记(2) Activity生命周期

1. 单个Activity的生命周期 当只有一个Activity的时候&#xff0c; 首先执行onCreate->onStart->onResume。 这时&#xff0c; 窗口便显示在屏幕上了。 然后我们按返回键退到桌面的时候&#xff0c;便执行onPause->onStop。这时候&#xff0c; 如果我们在最近使用程序…

墙角的父亲(一篇让千万人潸然泪下好文)

前言&#xff1a;拥有思想的瞬间&#xff0c;是幸福的&#xff1b;拥有感受的快意&#xff0c;是幸福的&#xff1b;拥有父爱也是幸福的。帮老乡大将搬家。在整理一堆旧书籍的时候&#xff0c;大将蹲在地上呜呜大哭起来。大将打开的是一个笔记本&#xff0c;上面记着日常开支&a…

react遍历对象的值_React 原理之实现 createElement 和 render 方法

前言在 React 中&#xff0c;我们都知道可以写 jsx 代码会被编译成真正的 DOM 插入到要显示的页面上。这具体是怎么实现的&#xff0c;今天我们就自己动手做一下。实现 createElement 方法这个方法平时开发我们并不会用到&#xff0c;因为它是经 babel 编译后的代码&#xff0c…

成熟就是深谙世故却不世故

对于一个打小在农村长大的孩子而言&#xff0c;被夸作“早熟”是一种荣耀。它意味着你足够懂事&#xff0c;可以分担父母的一些忧愁。但这也是一个怪圈&#xff0c;因为你常要背负这种光环去做一些超乎自己年龄的事&#xff0c;强迫自己变得坚忍、不可战胜。那年&#xff0c;我…

什么叫工作到位?很深刻!

1、汇报工作说结果不要告诉老板工作过程多艰辛&#xff0c;你多么不容易&#xff01;老板不傻&#xff0c;否则做不到今天。举重若轻的人老板最喜欢&#xff0c;一定要把结果给老板&#xff0c;结果思维是第一思维。2、请示工作说方案不要让老板做问答题&#xff0c;而是要让老…

react 给一个引用的组件添加新属性_高阶组件在React中的应用

高阶组件的定义接受React组件作为输入&#xff0c;输出一个新的React组件。概念源自于高阶函数&#xff0c;将函数作为参数&#xff0c;或者输出一个函数&#xff0c;如map&#xff0c;reduce&#xff0c;sort。 用haskell的函数签名来表示&#xff1a; hocFactory:: W: React.…

好好的活,简简单单过!

生命&#xff0c;每个人只有一次&#xff0c;或长或短&#xff1b;生活&#xff0c;每个人都在继续&#xff0c;或悲或欢&#xff1b;人生&#xff0c;每个人都在旅途&#xff0c;或起或伏。人无完人&#xff0c;事无完美&#xff0c;有些小人&#xff0c;你不须计较&#xff0…

lunixs 退出mysql_MySQL的基本操作

1、数据库登录格式&#xff1a;mysql -h主机地址 -u用户名 -p用户密码 -P端口 -D数据库 -e “SQL内容”[rootwulaoer ~]# mysql -uroot -p2、修改密码格式&#xff1a;mysqladmin -u用户名 -p旧密码 password 新密码[rootwulaoer ~]# mysqladmin -uroot password 123456注&…

交际中你所不知道的说话的12个技巧!

1.“有一说一”和“自以为是”不同&#xff0c;别把粗鲁当成真性情与 他人相处&#xff0c;要遵循一个基本原则&#xff1a;己所不欲&#xff0c;勿施于人。你可以真挚地描述自己的感受&#xff0c;前提是不要带有攻击性&#xff0c;至于对他人做出评价和判断&#xff0c;则需要…

宽客的人amp;amp;事件映射

看完《宽客》这本书&#xff0c;叙事介绍20世纪华尔街对冲基金、股票、投资者依赖股市从直觉交易数学家的早期演化、物理学家用数学模型开发过程中的交易&#xff0c;这些进入金融数学家、物理学家依靠大数据分析、稍纵即逝的交易机会来买入卖出&#xff1b;同一时候找出交易模…

社交中的黄金法则,你要细细体会品味

1&#xff0c;不要急着用你的嘴&#xff0c;来为你的眼睛辩护什么。因为天知道你的嘴说出什么来。2&#xff0c;假如有人朝你扔石头&#xff0c;就收起来。因为那会是你日后建高楼的基石。3&#xff0c;能忍则忍&#xff0c;忍不了就改变&#xff0c;改变不了就认了哇。4&#…

这些略带幽默句子,笑的同时多感悟一下吧(收好)

1、穷&#xff0c;并不可怕&#xff0c;我怕穷着穷着就习惯了。2、世界上唯一不用努力&#xff0c;就能得到的只有年龄。3、我是你转身就忘的路人甲&#xff0c;凭什么陪你蹉跎年华到天涯&#xff1f;4、世界上最快乐的事情就是吃&#xff0c;第二快乐的是待会再吃。5、琴棋书画…

java 异常机制_深入理解Java异常处理机制

一、引子try…catch…finally恐怕是大家再熟悉不过的语句了&#xff0c;而且感觉用起来也是很简单&#xff0c;逻辑上似乎也是很容易理解。不过&#xff0c;我亲自体验的“教训”告诉我&#xff0c;这个东西可不是想象中的那么简单、听话。不信&#xff1f;那你看看下面的代码&…

做人:失信是最大的破产!

一个人最大的破产是信用的破产&#xff01;哪怕你一无所有&#xff0c;但只要信用还在&#xff0c;就还有翻身的本金。保护好信用&#xff0c;珍惜别人给你的每一次信任&#xff01;因为有时候我们只有一次机会&#xff01;朋友有时候就像钞票&#xff0c;有真也有假。我们需要…

【干货】微信公众号运营必备工具(完整版)

做微信公众号运营最基本的要素有两点&#xff1a;一是内容要强大&#xff08;内&#xff09;&#xff0c;二是排版要美观&#xff08;外&#xff09;。做好前者&#xff0c;你需要有充足的知识储备以及精彩独到的文笔作为支撑&#xff0c;而做好后者则相对简单许多&#xff0c;…

成功,要“借力”,不要“尽力”(深刻!)

01每个人都喜欢成功&#xff0c;却又时常感觉自己力不从心一个小男孩在院子里搬一块石头&#xff0c;父亲在旁边鼓励&#xff1a;“孩子&#xff0c;只要你全力以赴&#xff0c;一定搬得起来&#xff01;”但是石头太重&#xff0c;最终孩子也没能搬起来。他告诉父亲&#xff1…

从0开始学Java——JSPServlet——HttpServletRequest相关的几个路径信息

在HttpServletRequest中有几个获取路径的接口&#xff1a;getRequestURI/getContextPath/getServletPath/getPathInfo 这些接口互相之间有什么区别&#xff0c;通过下面这段代码就可以分辨清楚了&#xff1a; 1 WebServlet("/hello.view")2 public class FirstServle…