XML解析(DOM详解)

来源:互联网 发布:起名网站源码 编辑:程序博客网 时间:2024/05/17 22:50

DOM:Document Object Model(文档对象模型)
对于XMl应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准化接口规范。
DOM有三部分组成:核心(core),HTML,XML.
严格区分XML文档数中的根节点和根元素节点:根节点(Document)代表的是XML本身,是我们解析XML文档的入口,而根元素节点表示XML文档的根元素,它对应于文档的Root。

DOM的四个基本接口Document,Node,NodeList,NameNodeMap
JAXP(java API for XML Parsing):用于XML解析的java API。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,他根据一个系统变量来决定使用哪一个解析器,又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的,所以当在不同解析器之间进行切换时,只需要更改系统变量的值,而不是更改任何代码。这就是工厂所带来的好处。

DocumentBuilderFactory和DocumentBuilderFactory之间的关系。


<?xml version="1.0" encoding="utf-8"?>
<学生名册 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="student.xsd" >
    <学生 学号="1">
        <姓名>张三</姓名>
        <性别>男</性别>
        <年龄>20</年龄>
    </学生>
    <学生 学号="2">
        <姓名>李四</姓名>
        <性别>女</性别>
        <年龄>19</年龄>
    </学生>
    <学生 学号="3">
        <姓名>王五</姓名>
        <性别>男</性别>
        <年龄>21</年龄>
    </学生>
</学生名册>




import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

//递归的思想实现
public class DomTest3
{
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException
{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new File("student.xml"));
    Element root = doc.getDocumentElement();
    parseElement(root);
}
private static void parseElement(Element element)
{
    String tagName = element.getNodeName();
    NodeList children = element.getChildNodes();
    System.out.print("<"+tagName);
    //element 元素的所有属性构成的NameNodeMap对象,需要进行判断
    NamedNodeMap  map = element.getAttributes();
    //如果有属性
    if(null !=map)
    {
        for(int i = 0;i<map.getLength();i++)
        {
            //或的元素的每一个属性
            Attr attr = (Attr)map.item(i);
            
            String attrName = attr.getName();
            String attrValue = attr.getValue();
            
            System.out.print(" "+attrName +"="+attrValue+"\"");
                    
        }
    }
    System.out.print(">");
    for(int i = 0;i<children.getLength();i++)
    {
        Node node=children.item(i);
        short nodeType = node.getNodeType();
        if(nodeType == Node.ELEMENT_NODE)
        {//是元素 继续递归
            parseElement((Element)node);
            
        }
        else if(nodeType == Node.TEXT_NODE)
        {
            //递归出口
            System.out.print(node.getNodeValue());
            
        }
        else if (nodeType == Node.COMMENT_NODE)
        {
            System.out.print("<!--");
            Comment comment = (Comment)node;
            //注释内容
            String data = comment.getData();
            System.out.print(data);
            System.out.print("-->");
        }
    }
    System.out.print("</"+tagName+">");
}
}

原创粉丝点击