DOM 相关知识整理
1. DOM, 全名为 Document Object Model, 文档对象模型。基于 DOM 的 XML 分析器将一个 XML 文档转换成一个对象模型的集合,通常称为 DOM 树,应用程序正是通过对这个对象模型的操作,来实现对 XML 文档数据的操作。也成为随机访问机制。
2. DOM 分析器把整个 XML 文档转化成 DOM 树放在内存里,当文档较大或者结构较复杂时,对内存的需求比较高。
3. DOM 的四个核心操作接口:
Document: 此接口代表了整个 XML 文档,表示整个 DOM 树的根,提供了对文档中的数据进行访问和操作的入口。通过 Document 节点可以访问 XML 文件中所有的元素数据。
常用方法:
public NodeList getElementsByTagName (string tagname) // 取得指定节点名称的 NodeList
public Element createElement(String tagName) throws DOMException // 创建一个指定名称的节点
public Text createTextNode(String data) // 创建一个文本内容节点
Element createElement(String tagName) throws DOMException //创建一个节点元素
public Attr createAttribute(String name) throws DOMException //创建一个属性
Node: 此接口在整个 DOM 树中具有举足轻重的低位,DOM 操作的和新接口中有很大一部分接口是从 Node 接口中继承过来的。
常用方法:
Node appendChile(Node newChile) throws DOMException // 在当前节点下增加一个新节点
public NodeList getChileNodes() //取得本节点下的全部子节点
public Node getFirstChile() //取得本节点下第一个子节点
public Node getLastChile() //取得本几点下最后一个子节点
public boolean hasChileNodes() //判断是否还有其他节点
public boolean hasAttributes() //判断是否还有其他属性
String getNodeValue() throws DOMException //取得节点内容
NodeList: 此接口表示一个节点的集合,一般用于表示有顺序关系的一组节点。
常用方法:
public int getLength() //取得节点的个数
public Node item(int index) //根据索引取得节点对象
NamedNodeMap:此接口表示一组节点和其唯一名称对应的一一对应关系,主要用于属性节点的表示。
进行 DOM 解析操作的基本操作流程:
1. 建立 DocumentBuilderFactory: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2. 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
3. 建立 Document: Document doc = builder.parse("要读取的文件路径");
4. 建立 NodeList: NodeList nl = doc.getElementsByTagName("读取节点");
5. 进行 XML 信息读取。
下面的代码是一个简单的读取节点的例子,sample 文件如下
<?xml version="1.0" encoding="GBK"?>
<addresslist>
<name>Tiky</name>
</addresslist>
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.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DOMDemo01 { /** * @param args * @throws ParserConfigurationException */ public static void main(String[] args){ // TODO Auto-generated method stub //建立 DocumentBuilderFactory, 以取得 DocumentBuilder DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //通过 DocumentBuilderFactory,取得 DocumentBuilder DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } Document doc = null; try { doc=builder.parse("D:\\test"+File.separator+"test.xml"); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } NodeList nl= doc.getElementsByTagName("name"); System.out.println("姓名:"+ nl.item(0).getFirstChild().getNodeValue()); } }
注释:
1. 在 DOM 解析中,每一个节点的内容实际上都是一个单独的文本节点,所以以下语句表示的是
nl.item[0].getFirstChile().getNodeValue()
取得 name 节点下的第一个子节点的第一个文本节点,并通过 getNodeValue()取得了节点的内容。
下面的例子是一个带循环的输出节点的例子,sample 文件如下
<?xml version="1.0" encoding="UTF-8"?>
<menutree>
<item>
<main>
<text>软件要求</text>
<url>movies/软件要求.swf</url>
<fps>30</fps>
<width>800</width>
<height>600</height>
</main>
</item>
<item>
<main>
<text>本地化思想</text>
<url>movies/本地化思想.swf</url>
<fps>30</fps>
<width>800</width>
<height>600</height>
</main>
</item>
<item>
<main>
</menutree>
代码:
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.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DOMDemo01 { /** * @param args * @throws ParserConfigurationException */ public static void main(String[] args){ // TODO Auto-generated method stub //建立 DocumentBuilderFactory, 以取得 DocumentBuilder DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //通过 DocumentBuilderFactory,取得 DocumentBuilder DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } Document doc = null; try { doc=builder.parse("D:\\test"+File.separator+"test.xml"); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } NodeList nl= doc.getElementsByTagName("item"); for (int i=0; i<nl.getLength();i++) { Element e =(Element)nl.item(i); System.out.println(i +". " + e.getElementsByTagName("text").item(0).getFirstChild().getNodeValue()); System.out.println("宽度: "+ e.getElementsByTagName("width").item(0).getFirstChild().getNodeValue()); } } }