DOM解析核心类库预览

Java中的DOM解析

  • xml文档的主要作用就是用于数据的存储,java中定义有一些对xml文件内容读取的类库,DOM解析技术就是其中一种,其他还有"SAX"解析,JDOM解析,DOM4J解析,

  • 其中DOM解析是w3c定义的一套标准接口规范,主要的特点就是跨平台(其他语言也有这种技术,例如JavaScript),DOM解析时需要将整个xml文件加载到内存中,所以在读取比较小的xml文件的时候,查询数据速度较快.这也是w3c(万维网联盟)所推荐的一种方式.

  • 缺点就是:如果xml文件过大,那么DOM解析读取数据的速度可能变慢.

  • 示例:如果有以下的一段xml文件,使用DOM解析该如何去除xml中的数据内容

<?xml version="1.0" encoding="utf-8"?>
<shop>
	<book>
		<name>新的世界,新的你</name>
		<year>3</year>
		<price >56.6</price>
	</book>
	<book>
		<name>java入门到跑路</name>
		<year>111</year>
		<price >100</price>
	</book>
</shop>

DocumentBuilderFactory类

  • 要读取一个xml文件,首先需要一个读取xml文件的解析器,解析器的作用就是读取xml文件内容,而生成一个树结构数据.
  • 在java中要得到一个DOM解析器需要通过java中的DocumentBuilderFactory这个类来取得解析器工厂对象(DocumentFactory接口),该类是一个抽象类,所以需要使用该类中的newInstance()方法获取到该类的实例化对象.
  • 而后使用newDocumentBuilder()这个方法,取得DocumentBuilder接口实例化对象
DocumentBuilderFactory解析器工厂类主要方法
public static DocumentBuilderFactory newInstance() 得到DocumentBuilderFactory类对象
public abstract DocumentBuilder newDocumentBuilder()throws ParserConfigurationException 得到XML文档创建类对象(DOM解析器)
  • 1. 创建一个TestXmlDoc.java程序类
public class TestXmlDom {
    public static void main(String[] args)throws Exception{
        //取得解释器工厂类对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

    }
}

DcoumnetBuilder:文档创建类

  • 得到DocumentBuilder类对象之后,就可以通过这个对象完成对一个xml文件的解析,并将xml文件解析为一个对象返回.
  • 在DOM中一整个XML文件就是一个文件节点,所以java中使用Document类描述一个xml文件
DocumentBuilder类主要方法
public abstract Document newDocument() 创建一个XML文档节点
public Document parse(File f)throws SAXException, IOException 将一个文件解析为一个Document对象
public Document parse(String uri) throws SAXException, IOException 给定一个文件路径,将这个文件转换为一个Document对象
public Document parse(InputStream is)throws SAXException, IOException 根据一个字节流,解析为一个Document对象
  • 2. xml文件为本地e盘中的文件,所以就是用java中的File类来描述这个文件
    • xml文件所在的路径"E:\testWeb\info.xml"
    • 在TestXmlDom.java程序类中解析xml文件
public class TestXmlDom {
    public static void main(String[] args)throws Exception{
        //取得解释器工厂类对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        //描述xml文件
        File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
        //解析xml文件
        Document xmlDoc = documentBuilder.parse(xmlFile);

    }
}

文档处理操作接口Document

  • Document接口,他继承自org.w3c.dom.Node接口,Document描述一整个xml文件,在DOC中一个xml文件为一个文档节点,其他所有节点都在文档节点之下,包括根节点.
Document操作接口的主要方法
Attr createAttribute(String name) throws DOMException 创建给定名称的属性对象(Attr接口表示一个节点的属性)
Element createElement(String tagName)throws DOMException 根据一个名称,创建一个元素
Text createTextNode(String data) 创建一个文本节点
NodeList getElementsByTagName(String tagname) 通过指定的节点名称,取得一个NodeList集合
  • 3. 取得所有book节点
public class TestXmlDom {
    public static void main(String[] args)throws Exception{
        //取得解释器工厂类对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        //描述xml文件
        File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
        //解析xml文件
        Document xmlDoc = documentBuilder.parse(xmlFile);
        //取得根节点下的所有子节点
        NodeList allNode = xmlDoc.getElementsByTagName("book");
        	
    }
}

org.w3c.dom.Node节点处理接口

  • DOM操作中每一个节点都是用Node接口描述,DOM中许多操作接口都继承自Node接口,例如Document,Attr,Element
  • 在Node接口中可以获取到一个节点的名称,内容.
Node接口的主要操作方法
Node appendChild(Node newChild) throws DOMException 在当前节点中追加一个子节点
Node cloneNode(boolean deep) 克隆一个子节点
NodeList getChildNodes() 得到所有子元素, 返回一个包含该节点的所有子节点NodeList集合
String getNodeName() 取得节点名称
getLastChild() 得到最后一个子元素
short getNodeType() 取得节点类型,节点的类型使用Node接口中定义的短整型常量表示
String getNodeValue() throws DOMException 取得节点内容
Node getParentNode() 取得该节点的父节点
String getTextContent() throws DOMException 取得节点的文本内容
boolean hasAttributes() 判断该节点是否有属性
boolean hasChildNodes() 判断该节点下是否有子元素
Node removeChild(Node oldChild)throws DOMException 删除当前节点下的子节点,并返回删除的子节点
Node replaceChild(Node newChild, Node oldChild)throws DOMException() 替换子节点,并返回被取代的节点
void setTextContent(String textContent) throws DOMException 设置文本内容
  • 4. 此时的程序已经得到了两个book节点,通过循环,再取出book节点下的所有子元素
    • 因为Element接口也继承自Node接口,因此可以进行向下转型
    • 而Element接口中定义有根据元素名称取得指定元素的方法,所以需要向下转型为Element
 public static void main(String[] args)throws Exception{
        //取得解释器工厂类对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        //描述xml文件
        File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
        //解析xml文件
        Document xmlDoc = documentBuilder.parse(xmlFile);
        //取得根节点下的所有子节点(book)
        NodeList allNode = xmlDoc.getElementsByTagName("shop");
        //循环取出每一个子节点
        for (int i = 0; i < allNode.getLength(); i++) {
        	//取出book节点下的所子元素
             Element item = (Element)allNode.item(i);
           
        }
    }

Element:元素描述接口

  • Element接口用于描述xml文件中的一个元素,元素代表xml中的一个标签,而Node接口描述xml文件中任何一个内容(文档,注释,标签,文本,属性等),所以Element属于Node,Element接口也直接继承自Node接口,可以直接使用Node接口中的方法来获取Element接口对象.
Element中的主要方法
String getAttribute(String name) 得到指定的属性内容
void setAttribute(String name,String value) throws DOMException 设置指定名称的属性内容,如果该属性不存在,则创建一个新的属性
NodeList getElementsByTagName(String name) 取得所有指定元素标签名的节点集合
String getTagName() 取得元素标签名称
void removeAttribute(String name) throws DOMException 删除指定名称的属性,如果该属性不存在则方法无效
  • 取出xml文件中的元素内容
public static void main(String[] args)throws Exception{
        //取得解释器工厂类对象
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        //描述xml文件
        File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
        //解析xml文件
        Document xmlDoc = documentBuilder.parse(xmlFile);
        //取得根节点下的所有子节点(book)
        NodeList allNode = xmlDoc.getElementsByTagName("book");
        //循环取出每一个子节点
        for (int i = 0; i < allNode.getLength(); i++) {
            Element item = (Element)allNode.item(i);
            System.out.println("书名 : "+ item.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
            System.out.println("出版时间 : "+ item.getElementsByTagName("year").item(0).getFirstChild().getNodeValue());
            System.out.println("价格 : "+ item.getElementsByTagName("price").item(0).getFirstChild().getNodeValue());

        }
    }
  • 控制台输出结果

在这里插入图片描述

文本描述,org.w3c.dom.Text

  • Text接口描述xml文档中元素的字符串部分,例如"2018年12月31日19:14:03"内容就属于"date"元素的字符串部分.
<date>2018年12月31日19:13:40</date>

属性描述:org.w3c.dom.Attr

  • Attr接口描述xml文档中的元素的属性,Attr也继承自Node接口,Attr与其他对象(Element,Text,等有关联但但他们是截然不同的)
String getName() 取得属性名称
String getValue() 取得属内容
void setValue(String value) throws DOMException 设置 属性内容

核心类的关系图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43386754/article/details/85490560