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();
File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.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集合 |
public class TestXmlDom {
public static void main(String[] args)throws Exception{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.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();
File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
Document xmlDoc = documentBuilder.parse(xmlFile);
NodeList allNode = xmlDoc.getElementsByTagName("shop");
for (int i = 0; i < allNode.getLength(); i++) {
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 |
删除指定名称的属性,如果该属性不存在则方法无效 |
public static void main(String[] args)throws Exception{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
File xmlFile = new File("E:"+File.separator+"testWeb"+File.separator+"info.xml");
Document xmlDoc = documentBuilder.parse(xmlFile);
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 |
设置 属性内容 |
核心类的关系图