DOM解析
JAXP(Java API for XML Parsing) :用于XML解析的Java API。
本文通过一个实际的代码例子来说明如何用Java提供的DOM相关的类和接口解析XML:
首先,是XML文档:persons.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE persons [ <!ENTITY xx "我不是一个随便的人,我随便起来不是人"> ]> <persons> <![CDATA[ 从今天起,恶心才刚刚开始, 但是这很重要,我不会把不重要的东西教给大家! ]]> <!-- 这是xml文档的注释 --> <person id = "p01"> <name>张三</name> <age>15</age> <address>南京市</address> <info>&xx;</info> </person> <person id = "p02"> <name>李小龙</name> <age>20</age> <address>美国</address> </person> <person id = "p03"> <name>张小凡</name> <age>21</age> <address>香港</address> </person> </persons>
新建Java类,解析如下:
package cn.org.kingdom.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class DomParseTest { public static void main(String[] args)throws Exception { //step1:获得document解析器工厂 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //step2:获得document解析器 DocumentBuilder db = dbf.newDocumentBuilder(); //step3:通过document解析器得到文档对象 Document doc = db.parse(new File("src/persons.xml")); //step4:获得所有的person节点 NodeList list = doc.getElementsByTagName("person"); //step5:循环遍历 for(int i = 0 ;i<list.getLength();i++) { Node node = list.item(i); Element e = (Element) node; //注意元素<name></name>之间是文本节点也点新获取 String name = e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue(); String age = e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue(); String address = e.getElementsByTagName("address").item(0).getFirstChild().getNodeValue(); System.out.println(name+"-->"+age+"-->"+address); } } }
首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。
DocumentBuilder db = dbf.newDocumentBuilder();
当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象。这个对象代表了具体的DOM解析器。
解析器的具体实现对于程序来说并不重要,然后,我们就可以利用这个解析器对文档进行解析了。Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。
最后附上我的微信号:15189838151,仅仅作为技术交流与分享!
或者扫描二维码(长按图片,然后点击识别图中二维码)也可以
时间: 2024-10-04 21:01:20