javaWEb-day01(XML编程)
来源:互联网 发布:天刀捏脸数据女御姐脸 编辑:程序博客网 时间:2024/05/19 03:28
XML编程
就是:写java程序操作XML文档。增删改查(CRUD)create read update delete
XML解析方式
分为两种:dom和sax。操作XML文档,如果你想增删改,请用dom。如果你想查找,请用sax。
dom:
(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。
由于用dom解析方法解析,需要把所有节点都变成对象进内存,所以如果这个XML文件很大,这时java虚拟机就会跑不起来。
我们来看看java虚拟机的默认内存多大:64M
把java虚拟机内存改成80M:
这样就可以运行60M的程序了。因为java虚拟机它本身也占一定的内存。
等20秒,这个程序运行完毕,刚才给java虚拟机分配的内存就又还给电脑了。
在控制台这么改:
sax:
(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
读取一行,解析一行。
特点:对内存消耗小,效率特别高。
但是sax方式不适合用,只适合用来在XML中查找数据。
XML解析器
支持这两种解析方式的一些解析器:
Crimson(sun)完败、Xerces(ibm) 都贡献给了apache。Aelfred2(dom4j)
由于程序员自己写程序去调用这些解析器比较困难。
sun公司为了我们方便的操作XML文档,又写了一些API对解析器进行了包装。
XML解析开发包
Jaxp(sun)这个API在1.4以前调用的是Crimson(sun)解析器,在1.5以后调用的是Xerces(ibm)解析器。
Jdom 的开发人员有了分裂,
dom4j(以前没有)分裂出来的开发人员又开发出了dom4j。完胜。使用的解析器是Aelfred2(dom4j)。
虽然dom4j完胜Jaxp(sun),但是我们还是要学Jaxp(sun),因为它是标准,现在不行,不代表将来不行。
JAXP
JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成.
在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。
使用JAXP进行DOM解析
javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
获得JAXP中的DOM解析器:
- 调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
- 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
- 调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
javax.xml.parsers
类 DocumentBuilderFactory
public abstract class DocumentBuilderFactory
protected
DocumentBuilderFactory()
用于阻止实例化的受保护构造方法。
static DocumentBuilderFactory
newInstance()
获取
DocumentBuilderFactory
的新实例。abstract DocumentBuilder
newDocumentBuilder()
使用当前配置的参数创建一个新的
DocumentBuilder
实例。javax.xml.parsers
类 DocumentBuilder
public abstract class DocumentBuilder
Document
parse(File f)
将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM
Document
对象。abstract Document
parse(InputSource is)
将给定输入源的内容解析为一个 XML 文档,并且返回一个新的 DOM
Document
对象。 Document
parse(InputStream is)
将给定
InputStream
的内容解析为一个 XML 文档,并且返回一个新的 DOM Document
对象。 Document
parse(InputStream is, String systemId)
将给定
InputStream
的内容解析为一个 XML 文档,并且返回一个新的 DOM Document
对象。 Document
parse(String uri)
将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM
Document
对象。org.w3c.dom
接口 Document
public interface Document
Element
getElementById(String elementId)
返回具有带给定值的 ID 属性的
Element
。 NodeList
getElementsByTagName(String tagname)
按文档顺序返回包含在文档中且具有给定标记名称的所有
Element
的 NodeList
。org.w3c.dom
接口 NodeList
public interface NodeList
int
getLength()
列表中的节点数。
Node
item(int index)
返回集合中的第
index
个项。org.w3c.dom
接口 Node
public interface Node
String
getTextContent()
此属性返回此节点及其后代的文本内容。
- DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
- 在dom中,节点之间关系如下:
- 位于一个节点之上的节点是该节点的父节点(parent)
- 一个节点之下的节点是该节点的子节点(children)
- 同一层次,具有相同父节点的节点是兄弟节点(sibling)
- 一个节点的下一个层次的节点集合是节点后代(descendant)
- 父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)
Node对象
- Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)
- Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。
查看第一个售价标签的值:
package cn.itcast.jaxp;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class Demo1 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//1.创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.创建解析器DocumentBuilder builder = factory.newDocumentBuilder();//3.获得指定XML文档的document对象Document document = builder.parse(new File("src/book.xml"));read(document);}//得到售价标签的内容public static void read(Document document){NodeList list = document.getElementsByTagName("售价");Node node = list.item(0);String value = node.getTextContent();System.out.println(value);}}
更新XML文档
1.javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。
2.Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:
- javax.xml.transform.dom.DOMSource类来关联要转换的document对象,
- 用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。
javax.xml.transform
类 TransformerFactory
static TransformerFactory
newInstance()
获取
TransformerFactory
的新实例。abstract Transformer
newTransformer()
创建执行从
Source
到 Result
的复制的新 Transformer
。javax.xml.transform
类 Transformer
abstract void
transform(Source xmlSource, Result outputTarget)
将 XML
Source
转换为 Result
。javax.xml.transform.dom
类 DOMSource
public class DOMSource
implements Source
DOMSource(Node n)
创建带有 DOM 节点的新输入源。javax.xml.transform.stream
类 StreamResult
public class StreamResult
implements Result
StreamResult(File f)
从 File 构造 StreamResult 。
org.w3c.dom
接口 Element
public interface Element
extends Node
void
setAttribute(String name, String value)
添加一个新属性。
void
removeAttribute(String name)
通过名称移除一个属性。
org.w3c.dom
接口 Node
static short
ATTRIBUTE_NODE
该节点为
Attr
。static short
CDATA_SECTION_NODE
该节点为
CDATASection
。static short
COMMENT_NODE
该节点为
Comment
。static short
DOCUMENT_FRAGMENT_NODE
该节点为
DocumentFragment
。static short
DOCUMENT_NODE
该节点为
Document
。static short
DOCUMENT_POSITION_CONTAINED_BY
引用节点包含该节点。
static short
DOCUMENT_POSITION_CONTAINS
该节点包含引用节点。
static short
DOCUMENT_POSITION_DISCONNECTED
两个节点断开连接。
static short
DOCUMENT_POSITION_FOLLOWING
该节点在引用节点之后。
static short
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
对前后位置的确定是特定于实现的。
static short
DOCUMENT_POSITION_PRECEDING
第二个节点在引用节点之前。
static short
DOCUMENT_TYPE_NODE
该节点为
DocumentType
。static short
ELEMENT_NODE
该节点为
Element
。static short
ENTITY_NODE
该节点为
Entity
。static short
ENTITY_REFERENCE_NODE
该节点为
EntityReference
。static short
NOTATION_NODE
该节点为
Notation
。static short
PROCESSING_INSTRUCTION_NODE
该节点为
ProcessingInstruction
。static short
TEXT_NODE
该节点为
Text
节点。方法摘要 short
getNodeType()
表示基础对象的类型的节点,如上所述。
DOM解析编程:
- 遍历所有节点
- 查找某一个节点
- 删除结点
- 更新结点
- 添加节点
package cn.itcast.jaxp;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class Demo1 {public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {//1.创建解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.创建解析器DocumentBuilder builder = factory.newDocumentBuilder();//3.获得指定XML文档的document对象Document document = builder.parse(new File("src/book.xml"));//遍历list(document);}//得到第一个售价标签的内容@Testpublic void read() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));NodeList list = document.getElementsByTagName("售价");Node node = list.item(0);String value = node.getTextContent();System.out.println(value);}//修改节点的值:<售价>39.00元</售价>改为109@Testpublic void update() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.getElementsByTagName("售价").item(0);node.setTextContent("109元");TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//向指定节点中增加孩子节点:增加内部售价59元@Testpublic void add() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.createElement("售价");node.setTextContent("59元");Node book = document.getElementsByTagName("书").item(0);book.appendChild(node);TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//向指定位置上插入节点:在<书名>节点前添加<售价>39元</售价>@Testpublic void insert() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.createElement("售价");node.setTextContent("39元");Node book = document.getElementsByTagName("书").item(0);book.insertBefore(node, document.getElementsByTagName("书名").item(0));TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//删除指定节点:删除<售价>59元</售价>@Testpublic void delete() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node node = document.getElementsByTagName("售价").item(2);Node parent = node.getParentNode();parent.removeChild(node);TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//操作XML文档属性:将第一个<书 name="xxxxxx"></书>节点的name属性值改为yyyyyy@Testpublic void updateAttribute() throws Exception{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document document = builder.parse(new File("src/book.xml"));Node book = document.getElementsByTagName("书").item(0);Element element = null;if(book.getNodeType() == Node.ELEMENT_NODE){element = (Element)book;}element.setAttribute("name", "yyyyy");element.setAttribute("password", "123456");element.removeAttribute("password");TransformerFactory factory1 = TransformerFactory.newInstance();Transformer transformer = factory1.newTransformer();transformer.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));}//遍历public static void list(Node node){if(node.getNodeType() == Node.ELEMENT_NODE){System.out.println(node.getNodeName());}NodeList list = node.getChildNodes();for(int x=0; x<list.getLength(); x++){list(list.item(x));}}}
使用JAXP进行SAX解析
dom4j
使用 dom4j 进行 DOM 解析
使用 dom4j 进行 SAX 解析
- javaWEb-day01(XML编程)
- javaWEb-day01(XML约束)
- javaWeb-day01(XML练习案例)
- javaWeb-day01(junit 测试工具、XML)
- javaWEb-day01(根据dtd文档写XML练习)
- javaweb-day01-5(XML 解析-概述)
- javaweb-day01-7(XML 解析-案例)
- day01-Javaweb xml基础
- 【Javaweb day01】XML
- javaweb-day01-3(XML 的 dtd 约束)
- javaWEb-day01(DTD约束语法细节)
- javaweb-day01-2(00:17:48 XML 的作用 和 语法)
- javaweb-day01-6(XML 解析 - Jaxp的DOM方式解析)
- javaweb-day01-4(DTD 的语法)
- Javaweb-xml编程-考生成绩管理系统(1)
- Javaweb-xml编程-考生成绩管理系统(2)
- Javaweb-xml编程-XPath
- Javaweb-xml编程-Schema
- INSTALL_FAILED_UPDATE_INCOMPATIBLE和INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
- Mybatis极其(最)简(好)单(用)的一个分页插件
- 大菲波数
- sublime中使用VS2012编译器
- POJ 1035:Spell checker:字符串操作
- javaWEb-day01(XML编程)
- JSP - Filter引起的一个奇怪错误 - 重复jsp内容
- 偷盗者--linux基本 解压缩
- 简介IntelliJ IDEAD
- Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题
- 简明 责任链模式(5.1)
- nosql包括的数据库
- iOS 多线程详解 NSThread, NSOperationQueue(NSInvocationOperation, NSBlockOperation), GCD
- uva 10152