DOM解析XML

package com.to.go.parse;

import java.awt.event.ItemEvent;
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.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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 ParseClass {
    
    /**
     * 更改属性 和 添加 
     * @throws TransformerFactoryConfigurationError 
     * @throws TransformerException 
     */

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerFactoryConfigurationError, TransformerException {
        // 1. 创建解析工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 获取解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 获取document对象
        Document doc = db.parse("src/main/java/com/to/go/parse/student.xml");
    
        //获取要添加属性的节点
        Node item = doc.getElementsByTagName("name").item(0);
        
        //node 类型不设置属性   要强制转为 元素类型 
        Element e = (Element)item;
        
        //设置属性
        e.setAttribute("name_id", "id_001");
        

        //从内存中同步到磁盘
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        
        tf.transform(new DOMSource(doc), new StreamResult("src/main/java/com/to/go/parse/student.xml"));

    }
    
    

    /**
     * 添加元素
     * @throws TransformerFactoryConfigurationError 
     * @throws TransformerException 
     */

    public static void main4(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerFactoryConfigurationError, TransformerException {
        // 1. 创建解析工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 获取解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 获取document对象
        Document doc = db.parse("src/main/java/com/to/go/parse/student.xml");
    
        //获取要删除的节点
        Node item = doc.getElementsByTagName("address").item(0);
        
        //获取该节点的父节点,从父节点中删除
        item.getParentNode().removeChild(item);

        //从内存中同步到磁盘
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        
        tf.transform(new DOMSource(doc), new StreamResult("src/main/java/com/to/go/parse/student.xml"));

    }
    
    /**
     * 添加元素
     * @throws TransformerFactoryConfigurationError 
     * @throws TransformerException 
     */

    public static void main3(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerFactoryConfigurationError, TransformerException {
        // 1. 创建解析工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 获取解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 获取document对象
        Document doc = db.parse("src/main/java/com/to/go/parse/student.xml");
    
        
        //创建一个节点
        Element createElement = doc.createElement("address");
        //设置元素内容
        createElement.setTextContent("地址1");
        //获取要添加的元素的父节点
        Node item = doc.getElementsByTagName("student").item(0);
        //添加节点
        item.appendChild(createElement);
        //从内存中同步到磁盘
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        
        tf.transform(new DOMSource(doc), new StreamResult("src/main/java/com/to/go/parse/student.xml"));
    
        
        
    }
    
    
    
    /**
     * 修改操作
     * @throws TransformerFactoryConfigurationError 
     * @throws TransformerException 
     * 
     */
    
    public static void main2(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerFactoryConfigurationError, TransformerException {
        // 1. 创建解析工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 获取解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 获取document对象
        Document doc = db.parse("src/main/java/com/to/go/parse/student.xml");
        
        
        //获取 age  节点
        NodeList ages = doc.getElementsByTagName("age");
        
        //获取集合中的要修改的节点
        Node age = ages.item(1);
        
        //修改元素内容
        age.setTextContent("18");
        
        //从内存中同步到磁盘
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        
        tf.transform(new DOMSource(doc), new StreamResult("src/main/java/com/to/go/parse/student.xml"));
    
        // 4. 查看修改后的内容
            NodeList list = doc.getElementsByTagName("age");
            Node name = list.item(1);
            
            System.out.println(name.getTextContent());//18
    }
    
    /**
     * 获取指定元素的值
     */

    public static void main1(String[] args) throws ParserConfigurationException, SAXException, IOException {
        // 1. 创建解析工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 获取解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 获取document对象
        Document doc = db.parse("src/main/java/com/to/go/parse/student.xml");
        // 4. 获取具体节点内容
        NodeList list = doc.getElementsByTagName("name");
        
        Node name = list.item(1);
        
        System.out.println(name.getTextContent());//蓝色妖姬
    }

}

 

 

xml 文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- 按 alt + / 自动生成网络DTD约束
<!DOCTYPE allPerson PUBLIC "//UNKNOWN/" "unknown.dtd">
 --><!-- 引入DTD约束 --><students>

<student number="s001">

<name name_id="id_001">匡衡</name>
<age>12</age>
<sex></sex>

</student>

<student number="s002">

<name>蓝色妖姬</name>
<age>18</age>
<sex></sex>

</student>

</students>

 

 

DTD文档:

 

<?xml version="1.0" encoding="UTF-8"?>

<!--<!ELEMENT students (student*)>
规定students 为根节点 子节点是 student 至少一个或多个
 -->
 
 <!--   <!ELEMENT student (name,age,sex)>
  规定 student 中的子元素 必须有 (name,age,sex)
  而且必须按照顺序出现
        -->


 <!--   <!ELEMENT name (#PCDATA)>
     name元素的中只能放文本
        -->
        
<!--   <!ATTLIST student number ID #REQUIRED>
     student 必须有一个属性 #REQUIRED 必选
     number 是属性名 属性的类型 是 ID 
     ID 不能重复
-->
        
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>

 

posted @ 2018-05-30 19:21  马鞍山  阅读(133)  评论(0编辑  收藏  举报