利用JAXP开发包进行DOM方式解析XML文档

来源:互联网 发布:matlab编程作业答案 编辑:程序博客网 时间:2024/04/27 16:30
JAXP进行DOM解析
            JAXP的API都在JavaSE中。
            org.w3c.dom:提供DOM方式解析XML的标准接口
            org.xml.sax:提供SAX方式解析XML的标准接口

            javax.xml:提供了解析XML文档的类

解析原理:


对下面的book.xml文档进行解析的实例:


<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
        <书 ISBN="a" 出版社="北京传智">
                <书名>Java就业培训教程</书名>
                <作者>&wzt;</作者>
                <售价>39.00元</售价>
        </书>
        <书 ISBN="b">
                <书名>JavaScript网页开发</书名>
                <作者>&wzt;</作者>
                <售价>28.00元</售价>
        </书>
</书架>




// 利用JAXP进行DOM方式解析
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.TransformerFactory;
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 JaxpDomDemo {


public static void main(String[] args) throws Exception {


            // 得到解析工厂DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();


            // 得到解析器DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();


            // 解析指定的xml文档,得到代表内存DOM树的Document对象
            Document document = builder.parse("src/book.xml");


            test1(document);
}


// 1.得到某个具体节点的内容: 打印第2本书的作者
public static void test1(Document document){
            // 根据标签的名称获取所有的作者元素
            NodeList nodes = document.getElementsByTagName("作者");
            // 按照索引获取第2个作者元素
            Node node = nodes.item(1);
            // 打印该元素的文本
            String text = node.getTextContent();
            System.out.println(text);
}


// 2.遍历所有元素节点:打印所有元素的名称
public static void test2(Node node){
            // 判断当前节点是否为元素节点
            if(node.getNodeType()==Node.ELEMENT_NODE){
            // 如果是,则打印他的名称
            System.out.println(node.getNodeName());
            }
            // 如果不是,找到它的孩子节点
            NodeList nodes = node.getChildNodes();
            int len = nodes.getLength();
            for (int i = 0; i < len; i++) {
            // 递归遍历孩子节点
            Node n = nodes.item(i);
            test2(n);
            }
}




// 3. 修改某个元素节点的主体内容: 把第一本书的售价改为38.00元
public static void test3(Document document) throws Exception{
            // 找到第一本书的售价
            NodeList nodes = document.getElementsByTagName("售价");
            // 设置其主题内容
            Node node = nodes.item(0);
            node.setTextContent("38.00元");
            // 把内存中的Document书写回xml文件中
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer ts = factory.newTransformer();
            ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}


// 4. 向指定元素节点中增加子元素节点: 第一本书中增加子元素<内部价>10.00元</内部价>
public static void test4(Document document) throws Exception{
            // 创建一个新元素并设置其主题内容
            Element e = document.createElement("内部价");
            e.setTextContent("10.00元");
            // 找到第一本书元素
            Node firstBookNode = document.getElementsByTagName("书").item(0);
            // 把新节点连接到第一本书上
            firstBookNode.appendChild(e);
            // 把内存中的Document书写会xml文件中
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer ts = factory.newTransformer();
            ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}


// 5. 向指定元素节点上添加同级元素节点: 在第一本书的售价前面增加批发价
public static void test5(Document document) throws Exception{
            // 创建一个新元素并设置其主体内容
            Element e = document.createElement("批发价");
            e.setTextContent("30.00元");
            // 找到第一本书的售价节点
            Node firstPriceNode = document.getElementsByTagName("售价").item(0);
            // 在售价节点的前面添加新建元素节点,注意: 增加子元素一定要使用父节点来做
            firstPriceNode.getParentNode().insertBefore(e,firstPriceNode);
            // 把内存中的Document写回XML文件中
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer ts = factory.newTransformer();
            ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}


// 6. 删除指定元素节点: 删除内部价节点
public static void test6(Document document) throws Exception{
            // 找到内部价节点
            Node innerPriceNode = document.getElementsByTagName("内部价").item(0);  
            // 用父节点删除内部价节点
            innerPriceNode.getParentNode().removeChild(innerPriceNode);
            // 把内存中的Document写回xml文件中
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer ts = factory.newTransformer();
            ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}


// 7. 操作xml属性: 打印第一本书的出版社
public static void test7(Document document){
            // 得到第一本书节点
            Node firstBookNode = document.getElementsByTagName("书").item(0);
            // 打印指定属性的取值,注意: 要将节点强制转换成元素,因为属性是元素的属性
            Element e = (Element)firstBookNode;
            System.out.println(e.getAttribute("出版社"));
}


// 8. 给第二本书添加一个属性: 出版公司: 北大书店公司
public static void test8(Document document) throws Exception{
            // 得到第二本书节点
            Node secondBookNode = document.getElementsByTagName("书").item(1);
            // 添加新属性并设置取值: 注意要将节点强制转换成元素
            Element e = (Element)secondBookNode;
            e.setAttribute("出版公司", "北大书店公司");
            // 把内存中的Document写回到xml文件中
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer ts = factory.newTransformer();
            ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));
}





0 0