您的位置:首页 > 编程语言

XML的编程 (CRUD)

2011-11-07 18:53 155 查看
XML的编程 (CRUD)
CRUD代表的是--------增删改查

Xml编程的作用之一:在web中写配置文件,对文件进行解析

1、XML解析技术

(1)XML解析方式分为两种: Sax 和dom

(1)这两种标准并不是针对java,在各种语言环境下都可以实现

(2)dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

实现原理:把整个xml文档一次性读取出来,放到一个树形结构里,在需要的时候,查找特定节点,然后对节点进行读取和写。它的主要优势是实现简单,读写平衡,缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。

(3)(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

实现方法:在xml文档中查找特定条件的内容,只提取需要的内容

缺点:只能写

(4)Xml解析器: 用开发工具包来创建解析器

Crimson、Xerces 、Aelfred2

(5)Xml开发工具包

(6)Jaxp开发包

Jaxp、Jdom、dom4j

(2)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解析器

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

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

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

DOM编程

l DOM模型(document object model)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

在dom中,节点之间关系如下:

位于一个节点之上的节点是该节点的父节点(parent)

一个节点之下的节点是该节点的子节点(children)

同一层次,具有相同父节点的节点是兄弟节点(sibling)

一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

l Node对象

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

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

2、编写java程序dom方法完成xml文档的解析

通过javax.xml.parsers 包下的类来完成解析器的创建

DocumentBuilder的对象dom解析器,通过对于的工程类来创建

DocumentBuilderFactory是抽象的类

在工厂中用newinstance()方法来得到dom解析器的工厂类

SAXParser的对象是sax解析器 ,通过对于的工程类来创建

在xml文档中的所有内容都可以被当成节点处理

在Node节点类型定义了所有的节点的共性,在Node中的属性是nodeName,nodeType,noValues,在用下面的这三个方法去调用之后,就把他们封装成Node对象,根据Node中的属性一一对应,如果节点是一个元素,则nodeValue则为null

GetNodeName() 节点的名称

getNodeType() 节点的类型

getNodeVaule() 节点的值

Element是元素节点 1代表元素节点

Text 文本节点 在xml中空白处是文本节点 3代表文本节点

Attr为属性节点

例子:解析dom文档

// (1)生成工厂类的对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// (2)生成解析器
DocumentBuilder db = factory.newDocumentBuilder();
// (3)对xml文档进行解析,指定要读取的文件并赋值给Document的对象
Document doc = db.parse(new File("src/Book.xml"));

// 解析出的doc对象里面所有内容,在xml文档中的所有内容都可以别当成节点处理
// (4)读取book.xml文档中有几个节点?节点的名称?节点的类型及节点的值

Node root = doc.getChildNodes().item(0);// 查找根节点
System.out.println(root.getNodeName() + "---" +root.getNodeType()+ "---" + root.getNodeValue());

// 查找所有根节点的子节点
public static void findChildren(Document doc) {
// 先通过文档对象node得到根节点对象,通过根节点
// Node root = node.getChildNodes().item(0);//得到根节点
// 通过标签名字查找元素,得到的是节点列表
Node root = doc.getElementsByTagName("书架").item(0);

// 通过根节点root对象得到根节点所有的子节点,返回一个节点集合
NodeList list = root.getChildNodes();
System.out.println("根节点下的所有子节点个数" + list.getLength());
// item()返回集合中的第 index 个项。
for (int i = 0;i < list.getLength();i++) {
Node n = list.item(i);
System.out.println(n.getNodeName() + "-----" + n.getNodeType()
+ "----" + n.getNodeValue());
}
}

// 查找所有根节点的元素节点
public static void findElementChildren(Document doc) {
// 先通过文档对象doc得到根节点对象,通过根节点
Node root = doc.getElementsByTagName("书架").item(0);

// 通过根节点root对象得到根节点所有的子节点,返回一个节点集合
NodeList list = root.getChildNodes();
System.out.println("根节点下的所有子节点个数" + list.getLength());
boolean flag = false;
int count = 0;
for (int i = 0; i < list.getLength(); i++) {
Node n = list.item(i);
// 判断如果是元素节点 ELEMENT_NODE表示 该节点为 Element。
if (n.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(n.getNodeName() + "-----" + n.getNodeType()
+ "----" + n.getNodeValue());
count++;
flag = true;
}
}
System.out.println("元素的节点共" + count);
}

// 查找固定值的书的元素的第二个子节点
public static void findFixedChildren(Node node) {
NodeList list = node.getChildNodes();
int count = 0;
for (int i = 0; i < list.getLength(); i++) {
boolean flag = false;
Node n1 = list.item(i);
if (n1.getNodeName().equals("图书")) {
flag = true;
count++;
}
if (flag && count == 2) {
// 得到n1节点的所有子节点,输出
NodeList list1 = n1.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
Node n = list1.item(j);
System.out.println(n.getNodeName() + "-----"
+ n.getNodeType() + "----" + n.getNodeValue());
}
}
}
}

// 属性的遍历
public static void findAttiutes(Node node) {
// 所有属性的集合
NamedNodeMap map = node.getAttributes();
if (map != null) {
for (int i = 0; i < map.getLength(); i++) {
// 属性节点
Node d = map.item(i);
System.out.println(d.getNodeName() + "---" + d.getNodeType()
+ "----" + d.getNodeValue());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: