QQ:897980791

5. DOM解析XML

DOM解析模型:
DOM是以层次结构组织的节点或信息的片段集合,是XML数据的一种树形表示。
文档中所有的元素、属性、文本都会被解析成Node节点。
 
Jaxp中的DOM代码实现思路:
工厂类->解析器->解析器解析XML返回Document
1 //解析器工厂类    
2 DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance( );
3 //解析器类
4 DocumentBuilder builder = builderFactory.newDocumentBuilder( );
5 //解析生成Document对象
6 Document doc = builder.parse("xxx.xml");
7 //通过Document对象拿到Node节点

节点Node与元素Element:

通过查看Node源码,发现Node接口里面有很多静态变量,用于定义此节点是什么类型的。
 
注意:
父类是节点Node,子类是元素Element
Element 接口 继承了 Node接口
Document 接口 继承了 Node接口
 
常用方法:

通过ID获取元素:

doc.getElementById( )  必须使用DTD声明ID属性
doc.getElementsByTagName( )  返回NodeList集合
注意:
使用id获取元素时,必须要保证DTD约束属性为ID,
属性名字并非要取id,可以随意命名。
而不是元素中定义一个id名字的属性。
 
getNodeName( )   返回节点的名称
getNodeType( )    返回节点的类型
getNodeValue( )   返回节点的值
getTextContent( )   返回此节点及其后代的文本内容
getAttributes( )   返回属性集
 
通过标签获取Node节点:
NodeList list = document.getElementsByTagName("book");
int len = list.getLength();
Node node= list.item(0);    获取一则数据
System.out.println(node);
 
属性节点:
NamedNodeMap nnm=node.getAttributes();
int length=nnm.getLength();
Node att=nnm.item(0);
属性节点的,getNodeValue( ),getTextContent( )返回的值相同,
在XML中属性可以写到子标签中,Value就是Text
 
DOM的增删改查:
1.查询所有节点:
NodeList list =document.getChildNodes();
这个方法会把节点下面的直接子节点返回,包括结束节点。
因为Node有几个静态常量来代表节点类型,结束节点也是一种类型。
空格也算一个文本节点。
利用递归,打印出所有的节点。
 1 public void showAll() throws Exception{
 2     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
 3     DocumentBuilder builder = builderFactory.newDocumentBuilder();
 4     Document document = builder.parse("bookstore.xml");
 5     printAll(document);
 6     System.out.println("---------------------");
 7     NodeList list = document.getChildNodes();
 8     for (int i = 0; i < list.getLength(); i++) {
 9     //会把每个结束节点也打印出来,包括每个元素的结束节点。
10     System.out.println(list.item(i).getNodeName());
11   }
12 }
13 
14 //递归
15 public void printAll(Node node){
16     //增加if判断,就不会打印出结束节点了
17     if(node.getNodeType()==Node.DOCUMENT_NODE){
18     System.out.println("文档节点-"+node.getNodeName());
19     }else if(node.getNodeType()==Node.ELEMENT_NODE){
20        System.out.println("元素节点-"+node.getNodeName());
21        if(node.hasAttributes()){
22        NamedNodeMap list = node.getAttributes();
23        for (int i = 0; i < list.getLength(); i++) {
24        Node attNode = list.item(i);
25        System.out.println("属性节点-"+attNode.getNodeName()+"-V-"+attNode.getNodeValue());
26      }
27     }
28    }
29    //这里要注意,在XML中空格和换行也算文本节点
30    else if(node.getNodeType()==Node.TEXT_NODE){
31        System.out.println("文本节点-"+node.getTextContent());
32    }
33     else if(node.getNodeType()==Node.COMMENT_NODE){
34        System.out.println("注释-"+node.getNodeValue());
35    }
36    if(node.hasChildNodes()){
37    NodeList nodeList = node.getChildNodes();
38    for (int i = 0; i < nodeList.getLength(); i++) {
39        Node childNode = nodeList.item(i);
40        printAll(childNode);
41     }
42   }
43 }
2. 修改XML文件
Transform:
javax.xml.transform 包中的 Transformer 类
用于把代表 XML 文件的 Document 对象转换为某种格式后进行输出
例如把 Document 对象又重新写入到一个XML文件中
1 //把name节点的文本修改为Android
2 nameNode.setTextContent("Android");
3 //回写document
4 TransformerFactory transformFac =TransformerFactory.newInstance();
5 Transformer transformer = transformFac.newTransformer(); 
6 //transform方法需要两个参数,传递节点和流。
7 transformer.transform(new DOMSource(document),new StreamResult(new File("bookstore.xml")));
3. 添加元素到XML
 1 public void add() throws Exception { 
 2     //获取解析XML工厂对象,此处省略....
 3     // 获取根元素
 4     Node node = document.getElementsByTagName("books").item(0);
 5     // 创建各种元素,属性
 6    Element bookEle = document.createElement("book");
 7    Attr idAttr = document.createAttribute("id");
 8    // 两种设置属性的方法,都可以
 9    idAttr.setNodeValue("newBook1"); // Node的方法
10    // idAttr.setValue("newBook2"); // Attr的方法
11    Element name = document.createElement("name");
12    name.setTextContent("装B大全");
13    Element price = document.createElement("price");
14    price.setTextContent("¥9.9");
15    // 把创建好的添加到doc
16    // 添加属性用set,不是append
17    bookEle.setAttributeNode(idAttr);
18    bookEle.appendChild(name);
19    bookEle.appendChild(price);
20    node.appendChild(bookEle);
21    TransformerFactory transformFac =TransformerFactory.newInstance();
22    Transformer transformer = transformFac.newTransformer(); 
23    //transform方法需要两个参数,传递节点和流。
24    transformer.transform
               (new DOMSource(document),new StreamResult(new File("bookstore.xml")); 26 }
4. 删除
删除操作,需要用到删除节点的父节点 
利用 root.removeChild(element) 删除
1 //获取doc,省略代码.....
2 //删除指定id元素
3 Node root = document.getElementsByTagName("books").item(0);
4 Element element = document.getElementById("book_code_1");
5 root.removeChild(element);
6 //Transform 回写到XML,省略代码.....

 

注意:Transform 在回写时,会把原来XML文件的DTD约束清除。
 

posted on 2015-06-02 22:28  le_e.hao  阅读(173)  评论(0)    收藏  举报

导航

QQ:897980791