用DOM解析XML

二、XML解析

有两种解析方法:DOM(document object model)解析与SAX(simple API for XML)解析

XML解析开发包:

•JAXP:是SUN公司推出的解析标准实现。

•Dom4J:是开源组织推出的解析开发包。

•JDom:是开源组织推出的解析开发包。

JAXP(java API for XML processing)是javaSE的一部分,由三个子包组成

•org.w3c.dom:提供DOM方式解析XML的标准接口

•org.xml.sax:提供SAX方式解析XML的标准接口

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

javax.xml.parsers包中,定义了几个工厂类。我们可以通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。

•DocumentBuilderFactory

•SAXParserFactory


先看一下我们要解析的XML文档,文件名为books.xml

<?xml version="1.0" encoding="utf-8"?>
<书架>
    <书>
        <书名>浪潮之巅</书名>
        <作者>吴军</作者>
        <售价>39.00元</售价>
    </书>
    <书>
        <书名>数学之美</书名>
        <作者>吴军</作者>
        <售价>28.00元</售价>
    </书>
 </书架>
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.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 ParseXml {
    public static void main(String[] args) {
            //多态,返回的是内部实现的一个子类的实例
        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
        try {
            //多态
            DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
            //拿到文档对象模型,DOM树
            Document document=documentBuilder.parse("Books.xml");
            //从DOM树中取出标签名,返回一个结点list
            NodeList nodeList=document.getElementsByTagName("书");
            //取出下标为0的结点
            Node booksName0=nodeList.item(0);
            //取得结点的结点名称
            String name=booksName0.getNodeName();
            //取得该节点的父节点,返回一个结点node,调用getNodeName方法返回字符串
            String parentName=booksName0.getParentNode().getNodeName();
            System.out.println("结点名称:<"+name+">,父节点:<"+parentName+">");
            //===================================================================
            //二、打印某节点的所有元素节点 ,用第二个书结点
            Node bookname1=nodeList.item(1);
            NodeList childNodesList=bookname1.getChildNodes();
            int listLength=childNodesList.getLength();
            for (int i = 0; i < listLength; i++) {
                //因为XML中的空格换行等也属于子节点,故找到结点类型为1-->即元素,才打印
                if (childNodesList.item(i).getNodeType()==1) {
                String nodeName=childNodesList.item(i).getNodeName();
                System.out.println("第"+i+"个子节点<"+nodeName+">");
                }
            }
//            =========================================================================
//            三、修改某个元素结点的主体内容--->将"数学之美"改为"编程之美"
//            从子节点list中得到书名元素,用getTextContent
            String book2=childNodesList.item(1).getTextContent();
            System.out.println("更改之前的书名:"+book2);
            childNodesList.item(1).setTextContent("编程之美");
            System.out.println("更改之前的书名:"+childNodesList.item(1).getTextContent());
            //注意,更改了名字只是保存在内存中,并未保存到原文件中

//             =========================================================================
//             四、向指定元素节点中增加子元素节点,向第二本书增加一个子元素“评价”
            Element element= document.createElement("评价");
            element.setTextContent("五星");
            bookname1.appendChild(element);
//            ===============================================================================
//            五、删除元素结点,删除刚刚增加的元素
                Node comment=document.getElementsByTagName("评价").item(0);
                bookname1.removeChild(comment);

            //存盘的标准写法
            TransformerFactory tsf =TransformerFactory.newInstance();
             Transformer tsTransformer = tsf.newTransformer();
             tsTransformer.transform(
             new DOMSource(document),
             new StreamResult("src/books.xml"));

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会自动创建一个工厂的对象并返回

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

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

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


第二个例子

xml文档名为exam.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<exam>
    <student idcard="111" examid="222">
        <name>张三</name>
        <location>沈阳</location>
        <grade>89</grade>
    </student>
    <student idcard="333" examid="444">
        <name>李四</name>
        <location>大连</location>
        <grade>97</grade>
    </student>
</exam>
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.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
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 ExamXML {
    public static void main(String[] args) {
        //1. 向该xml文档里添加一个用户,姓名:王五,;location:铁岭;grade:99
        DocumentBuilderFactory documentBuilderFactory =    DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
            //拿到dom树
             Document document=documentBuilder.parse("exam.xml");
             //拿到父节点
            Node superNode = document.getElementsByTagName("exam").item(0);
            Element studentElement=document.createElement("student");
            Element nameElement=document.createElement("name");
            Element locationElement=document.createElement("location");
            Element gradeElement=document.createElement("grade");
            nameElement.setTextContent("王五");
            locationElement.setTextContent("铁岭");
            gradeElement.setTextContent("99");
            studentElement.appendChild(nameElement);
            studentElement.appendChild(locationElement);
            studentElement.appendChild(gradeElement);
            superNode.appendChild(studentElement);
            NodeList WangwuInfo=document.getElementsByTagName("student").item(2).getChildNodes();
            for (int i = 0; i < WangwuInfo.getLength(); i++) {
                if (WangwuInfo.item(i).getNodeType()==1) {
                    System.out.println("第"+i+"个标签内的文本是:"+WangwuInfo.item(i).getTextContent());
                }
            }
            //=========================================================================================
            //2. 给每个学生增加一条信息,性别

            NodeList studentList=document.getElementsByTagName("student");
            for (int i = 0; i < studentList.getLength(); i++) {
                Element gender=document.createElement("性别");
                studentList.item(i).appendChild(gender);
            }
            System.out.println("给每个学生增加性别标签,共有"+document.getElementsByTagName("性别").getLength()+"个学生增加");
            //==================================================================================
            //3. 删除第一个学生张三的所有信息。
            Node zhangsan=document.getElementsByTagName("student").item(0);
            superNode.removeChild(zhangsan);
            System.out.println("删除了张三后的学生标签有:"+studentList.getLength());
            //======================================================================================
            //4. 将第二个学生李四的姓名改为 李四光
                Node lisiInfo=document.getElementsByTagName("student").item(0);
                String lisiName=lisiInfo.getChildNodes().item(1).getTextContent();
                System.out.println("李四更改名字之前:"+lisiName);
                lisiInfo.getChildNodes().item(1).setTextContent("李四光");
                System.out.println("更改名字之后"+lisiInfo.getChildNodes().item(1).getTextContent());
            //=========================================================================================
            //5. 给每个学生增加一个ID属性
                //增加属性是元素对象的方法,故从Node强转为element类型
                for (int i = 0; i < studentList.getLength(); i++) {
                    Attr idAttr=document.createAttribute("id");
                    Element element=(Element) studentList.item(i);
                    element.setAttributeNode(idAttr);
                }
                //强转
                Element element=(Element) studentList.item(0);
                //设置属性
                element.setAttribute("id", "1234");
                //打印属性
                System.out.println("id:"+element.getAttribute("id"));
                Element element1=(Element) studentList.item(1);
                element1.setAttribute("id", "98765");
                System.out.println("id:"+element1.getAttribute("id"));

            //存盘操作
                TransformerFactory tsf =TransformerFactory.newInstance();
                 Transformer tsTransformer = tsf.newTransformer();
                 tsTransformer.transform(
                 new DOMSource(document),
                 new StreamResult("src/Exam.xml"));

        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }

    }
}
时间: 2024-12-28 16:10:49

用DOM解析XML的相关文章

DOM解析XML

DOM的文档驱动 处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象 优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问数据 缺点: 受内存容量限制,不能处理大的文档,由于没有索引机制,处理效率较低 DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来 操组整个树结构,其他点如下: 优点:整个文档树都在内存当中,便于操作:支持删

DOM的概念和简单应用:使用DOM解析XML数据

概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XML文档转换成一个DOM树,JAXP的三个包都在JDK中. org.w3c.dom;W3C推荐的解析文档的接口 org.xml.sax;使用SAX解析XML文档的接口 javax.xml.parsers;解析器工厂工具 一.使用DOM解析XML文档的步骤 1.创建解析器工厂对象,即DocumentBu

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 2.解析器:DocumentBuilder 创建方法:通过解析器工厂类来获得 DocumentBu

Android之DOM解析XML

一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息. Android完全支持DOM解析.利用DOM中的对象可以对XML文档进行读取.搜索.修改.添加和删除等操作. DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素.树形和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并

DOM解析XML文件

除了可以使用SAX解析XML文件,大家也可以使用熟悉的DOM来解析XML文件. DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树.检索所需的数据.使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单.但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小

Android DOM解析XML方法及优化

在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML.解析XML的方法有DOM, SAX, JDOM, DOM4J,本文中只使用了DOM,下面先介绍DOM的基础知识和解析XML的方法,然后再结合一个项目实例来实现从XML文件的下载到解析整个过程. DOM(Document Object Model,文档对象模型)定义了访问和操作XML的标准方法.基于

Dom解析xml,只是简单的解析出有效元素的元素名,元素值,属性名和属性值

DOM使用简单,但只适合于一些小的Xml文档,因为Dom解析Xml文档时,要将其读入内存,生成DOM树. 具体操作方法如下 要解析的XML文档 <persons> <person id="1001"> <name><![CDATA[<>上上</>]]></name> <!-- <![CDATA[<>上上</>]]> 预定义字符3. --> <sex&

使用DOM解析XML文件

首先写了一个xml文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>c#</name> <author>张三</author> <year>1990</year> <price>60</price> </book&