java-XML

XML不再多说,XML 约束也不用说了,这里讲讲java如何对XML操作。

java中使用XML,目前常用的就是Jaxp(sun)和dom4j了,这里先讲讲java自带的Jaxp包

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

Jaxp的xml解析器有两种,一种是DOM解析器,一种是SAX解析器,两种各自应用在不同的场景上。

在DOM解析时,会把xml中各个节点视为对象,然后根据父子关系相互嵌套。优点时容易操纵,缺点也很明显,必须全部通读xml并加载进内存。

DOM解析的流程:

1,DocumentBuilderFactory是抽象类,newInstance()方法会根据本地平台安装的xml解析器自动创建相应的工厂实力

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2,DocumentBuilder的newDocumentBuilder()方法会得到本地xml解析器相应的DocumentBuilder实力

DocumentBuilder documentB = dbf.newDocumentBuilder();

3,解析xml,根据DocumentBuilder的parse方法。

Document document = documentB.parse(new File(path));
//看文档可以知道,parse可以从解析File、InputSource(经过包装的InputStream)、InputStream和URI字符串

4,Document代表了整个XML文档,首先获取根节点,Element就是标签,它们都属于Node,也就是说,都实现了Node接口

Element root=document.getDocumentElement();

5,下面就是增删改查了

增加结点

//增加一个结点,注意,增加节点是对document操作,Document实现了这个方法
Element newStudent=document.createElement("student");//增加一个属性,属性也算是结点,一切都是Node
Attr cid=document.createAttribute("idcard");
//给属性设置值
cid.setValue("1121");//将属性添加进这个标签
newStudent.setAttributeNode(cid);//最后,将这个结点添加进根节点,注意,是对根节点添加,不是Document
root.appendChild(newStudent);

提取某节点信息(查)

//首先根据第3步,已经获得根结点,也就是Element root//获取所有标签名为sutdent的节点集合
NodeList students=root.getElementsByTagName("student");//至于获取标签属性以及text内容,自行看手册//要注意的是,换行和制表符'\n\t'这些,也会被当做text内容解析
//至于xml的编码问题,都是自动的,不用手动设置了。

更改结点内容(很多都是Node接口的方法,自行查看手册即可)

//设置标签内容
Node.setTextContent(String text)//设置属性内容
Attr.setValue(String value)

删除结点

Node.removeChild(Node node)

6,操作完xml,保存结果

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。
利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。
//1、获得Transformer工厂
TransformerFactory tff=TransformerFactory.newInstance();//2、对于DOM对象,使用树来表示,肯定是个多叉树了,,,
//这个类,就是将树,变为结果树
Transformer tf = tff.newTransformer();//3、把document(DOM)转换为xml source
Source sc=new DOMSource(document);//4、创建一个DOM目标,这里是个流
Result rs=new StreamResult(new File(path_URI));//5、将 XML Source 转换为 Result,这样就写入数据流了
tf.transform(sc, rs);

DOM解析就到这里,如果以网络流读取一个大的xml文件的话,这样肯定是不行的,不可能一直等到它全部读完载入内存再操作吧。。。。。光读取的话,就用SAX了。

SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器:
•解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
•解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理

2011060116262679.png

我们常用的就是ContentHandler了。

下面是sax示例

//定义工厂api,用以配置和获取sax解析器SAXParserFactory spf = SAXParserFactory.newInstance();//得到解析器对象SAXParser sp = spf.newSAXParser();//得到一个xmlreader读取器XMLReader xmlReader = sp.getXMLReader();//注册一个内容事件处理器 ContentHandler,一般情况下,使用ContentHandler接口的已知//子类DefaultHandler就行了xmlReader.setContentHandler(new DefaultHandler(){//为了方便,以内部类重写需要使用到的方法//开始读取标签public void startElement(String uri, //命名空间String localName, //标签名String qName, //限定名称Attributes attributes //属性){/////获取标签的个数attr.getLength();//其它的看手册				}//开始读取文档public void startDocument(){}//读取到标签尾public void endElement( String namespaceURI,String localName,String qName ) {}//读取标签体,注意的是,sax是分段读取的,每次最大读取是2kbpublic void characters(char[] ch,int start,int length){//读取大数据的时候注意sax是分段读取的,每次最大读取是2kb}});//开始读取xml数据xmlReader.parse("book.xml");

到这里,我们发现SAX虽然比DOM效率高,但是它是顺序读取的,无法回头,且只能从头到尾。

现在就可以使用Dom4j了,它是第三方包

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件。

lDOM4j中,获得Document对象的方式有三种:
//1.读取XML文件,获得document对象            SAXReader reader = new SAXReader();Document   document = reader.read(new File("input.xml"));//2.解析XML形式的文本,得到document对象.String text = "<members></members>";  
          Document document = DocumentHelper.parseText(text);

//3.主动创建document对象.Document document = DocumentHelper.createDocument();             //创建根节点Element root = document.addElement("members");

dom4j 中结点对象的操作:

  //1.获取文档的根节点.Element root = document.getRootElement();//2.取得某个节点的子节点.Element element=node.element(“书名");//3.取得节点的文字String text=node.getText();//4.取得某节点下所有名为“member”的子节点,并进行遍历.List nodes = rootElm.elements("member");for (Iterator it = nodes.iterator(); it.hasNext();) {Element elm = (Element) it.next();// do something}//5.对某节点下的所有子节点进行遍历.for(Iterator it=root.elementIterator();it.hasNext();){Element element = (Element) it.next();// do something}//6.在某节点下添加子节点.Element ageElm = newMemberElm.addElement("age");//7.设置节点文字.element.setText("29");//8.删除某节点.//childElm是待删除的节点,parentElm是其父节点parentElm.remove(childElm);//9.添加一个CDATA节点.Element contentElm = infoElm.addElement("content");contentElm.addCDATA(diary.getContent());

对节点对象属性的操作:

  //1.取得某节点下的某属性Element root=document.getRootElement();//属性名nameAttribute attribute=root.attribute("size");//2.取得属性的文字String text=attribute.getText();//3.删除某属性Attribute attribute=root.attribute("size");root.remove(attribute);//4.遍历某节点的所有属性Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){Attribute attribute = (Attribute) it.next();String text=attribute.getText();System.out.println(text);}//5.设置某节点的属性和文字.newMemberElm.addAttribute("name", "sitinspring");//6.设置属性的文字Attribute attribute=root.attribute("name");attribute.setText("sitinspring");

在指定位置中插入元素:

1.得到插入位置的节点列表(list)
2.调用list.add(index,elemnent),由index决定element的插入位置。
3.list中存储的是引用,对list进行了更改,既对document进行了更改
//Element元素可以通过DocumentHelper对象得到。示例代码:Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");List list = root.element("书").elements();
list.add(1, aaa);

写入XML文档

  //1.文档中全为英文,不设置编码,直接写入的形式.XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));writer.write(document);writer.close();//2.文档中含有中文,设置编码格式写入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码                   format.setEncoding("GBK");XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);writer.write(document);writer.close();

XML与字符串的转换

  //1.将字符串转化为XML String text = "<members> <member>sitinspring</member></members>";Document document = DocumentHelper.parseText(text);//2.将文档或节点的XML转化为字符串.SAXReader reader = new SAXReader();Document   document = reader.read(new File("input.xml"));Element root=document.getRootElement();    String docXmlText=document.asXML();String rootXmlText=root.asXML();Element memberElm=root.element("member");String memberXmlText=memberElm.asXML();

在Dom4j中使用xpath查询路径

xpath路径表达式就像正则表达式一样,可以免去自己写遍历对比代码了。

//dom4j的包中的document..........
List<Node> list = document.selectNodes("//xpath");

上面的所有代码基本上算是模板代码了,用的时候多看手册,拷贝粘贴就ok了

转载于:https://www.cnblogs.com/hangxin1940/archive/2011/06/01/2067356.html

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

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

相关文章

【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

今天学习C语言中的数据类型的本质与变量的本质 文章目录1 什么是数据类型2 变量的本质3 数据类型与变量的关系4 自定义数据类型与创建变量5 总结1 什么是数据类型 数据类型可以理解为固定内存大小的别名数据类型是创建变量的模子 如同下面的图示&#xff0c;各个数据类型是代…

使用第三方Markdown编辑器编辑为知笔记

前言 为知笔记默认的编辑器并没有预览功能&#xff0c;而提供的MD编辑器插件也并不是很好用&#xff0c;但为知笔记提供了可以使用第三方编辑器的功能&#xff0c;Typora编辑器是目前最优秀的Markdown编辑器之一&#xff0c;可以很好作为第三方编辑器。 Typora介绍 Typora是…

【C语言进阶深度学习记录】二 有符号与无符号

今天学习C语言中的有符号与无符号 文章目录1 计算机中的符号位1.1 有符号数的表示法1.2 无符号数的表示法1.3 signed 和 unsigned2 实验-当有符号数与无符号数进行运算3 错误的使用了unsigned4 总结1 计算机中的符号位 C语言中&#xff0c;数据类型的最高位&#xff0c;用于标…

【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法

相信大多数人知道整形数在内存中的分布方式&#xff0c;而且也能很容易写出其二进制的形式&#xff0c;但是对于浮点数&#xff0c;估计知道的人并不是很多今天学习在C语言中浮点数在内存中的表示方法 文章目录1 浮点数在内存中的存储方式1.1 浮点数的转换步骤1.2 浮点数的转换…

【C语言进阶深度学习记录】四 C语言中的类型转换

今天学习C语言中的类型转换&#xff0c;包括隐式类型转换和显示类型转换 文章目录1 C语言中的数据类型转换1.1 强制类型转换1.11 强制类型转换代码分析1.&#xff12; 隐式类型转换1.21 隐式类型转换代码分析2 总结1 C语言中的数据类型转换 C语言中&#xff0c;可以进行数据类…

【C语言进阶深度学习记录】五 C语言中变量的属性

上一篇文章学习了C语言中的类型转换&#xff0c;点击链接查看&#xff1a;【C语言进阶深度学习记录】四 C语言中的类型转换. 文章目录1 C语言的变量属性1.1 auto关键字1.2 register关键字1.3 static 关键字1.4 代码案例分析1.5 extern 关键字1.6 代码案例分析2 总结1 C语言的变…

【C语言进阶深度学习记录】六 C语言中的分支语句

文章目录1 if 语句的分析1.1 if 语句中零值比较的注意点2 switch 语句的分析3 if 与switch语句使用代码案例分析4 if语句与switch语句的互换5 总结1 if 语句的分析 if 语句根据条件选择执行语句else 不能独立存在&#xff0c;且总是与距离它最近的if匹配else 语句可以连接其他…

【C语言进阶深度学习记录】七 C语言中的循环语句

文章目录1 循环语句分析1.1 do...while循环1.2 while循环1.3 for循环1.4 三种循环语句使用对比2 break和continue的区别3 总结1 循环语句分析 C语言中的循环语句主要有for循环&#xff0c;while循环和do…while循环。 循环语句的基本工作方式&#xff1a; 通过条件表达式判断…

【C语言进阶深度学习记录】八 C语言中void的分析

文章目录1 void的意义1.1 不存在void变量1.2 C标准1.3 void指针的意义1.4 通过void* 实现memset函数2 总结1 void的意义 void修饰函数的参数和返回值的时候&#xff1a; 如果函数没有返回值应该将其返回值声明为void如果函数没有参数&#xff0c;应该将函数的参数声明为void如…

【C语言进阶深度学习记录】九 C语言中const的详细分析

文章目录1 const的分析2 const本质的分析实验2.1 代码案例分析3 const修饰函数参数和返回值时的情况3.1 代码案例分析4 总结1 const的分析 不管是C语言还是C语言&#xff0c;const都是一个非常重要的关键字。今天这篇文章着重学习记录C语言中的const。C语言中稍有不同。 在C语…

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小 C语言中的struct可以看成是变量的集合 如果一个struct里面什么都没有&#…

【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析

文章目录1 enum 枚举类型的使用方法1.1 enum枚举类型的特殊意义1.2 代码分析&#xff1a;enum的使用2 sizeof 关键字的用法2.1 代码案例分析&#xff1a;sizeof的本质3 typedef的意义3.1 代码案例&#xff1a;typedef 的使用案例4 总结1 enum 枚举类型的使用方法 enum是C语言中…

【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

文章目录1 C语言中的单引号和双引号1.1 双引号带来的BUG2 总结1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量C语言中的双引号用来表示字符串字面量&#xff0c;存储于全局的只读存储区 注意上面的字符与字符串的区别 下面的程序片段是否合法&#xff1f; 上面…

PetShop的系统架构设计[转]

前言&#xff1a;PetShop是一个范例&#xff0c;微软用它来展示.Net企业系统开发的能力。业界有许多.Net与J2EE之争&#xff0c;许多数据是从微软的PetShop和Sun的PetStore而来。这种争论不可避免带有浓厚的商业色彩&#xff0c;对于我们开发人员而言&#xff0c;没有必要过多关…

【C语言进阶深度学习记录】十三 C语言中 ++和--操作符

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 文章目录1 和--操作符的本质2 总结1 和–操…

【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

文章目录1 三目运算符1.1 三目运算符的返回类型的代码案例分析2 逗号表达式2.1 逗号表达式代码案例分析2.2 如何用一行代码实现 strlen函数3 总结1 三目运算符 三目运算符&#xff08;a?b:c&#xff09;可以作为逻辑运算的载体规则: 当a为真时&#xff0c;返回b&#xff0c;否…

POJ 1719 Shooting Contest

题目&#xff1a;http://poj.org/problem?id1719 要求每一行必须都被射到&#xff0c;每一列恰好一个格子被射到。 通过行r去求匹配数num 当r<c时&#xff0c;num是可以等于r的 这时候每一行都被射到过&#xff0c;可能存在列没有被射到&#xff0c;可以再该列中任意选一个…

【C语言进阶深度学习记录】十五 编译过程简介

文章目录1 初识编译器2 总结1 初识编译器 我们平时口中所说的编译器&#xff0c;是广泛的编译器。实际上&#xff0c;编译器包括了以下四个部分&#xff1a; 一个C代码被编译为可执行代码&#xff0c;包括以下几个过程&#xff1a; 下面就对上述的各个过程进行一个详细的说明&…

Android 各控件的使用 - 按钮(Button)

安卓按钮的使用 就不细说项目的设置什么的了&#xff0c;直接从添加Activity开始。 如图&#xff0c;src文件夹下添加一个ButtonActivity View Code packagecn.Kurodo;importcn.Kurodo.R.id;importandroid.app.Activity;importandroid.os.Bundle;importandroid.util.Log;impor…