JAXP技术
JAXP即Java Api for Xml Processing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术。大家可以参见SUN的以下两个包:
javax.xml.parsers.* à主要存储的是解析器
org.w3c.dom.*或org.w3c.sax.* à主要存储的是DOM解析或SAX解析需要的API
DOM解析主要采用DOM树的方式进行XML的数据解析。如:JavaScript中的DOM操作
SAX解析主要采用事件的方式进行XML的数据解析。如:JavaScript中的事件机制
XML解析原理
- 编写需要解析的XML文件
- 获取相应的XML解析器对象
- 使用API获取数据
- 返回数据给开发者
DOM解析
DOM解析采用的是DOM树的方式进行解析。
- 准备要解析user.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 1. 编写要解析的XML文件 --> <users> </users>
2. 获取解析器 // 2. 提供获取解析器的方法 public static DocumentBuilder getParser()throws Exception{ // 2.1 创建工厂类对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2.2 获取解析器对象 DocumentBuilder parser = factory.newDocumentBuilder(); return parser; }
3. 获取解析的DOM树对象 // 3. 提供获取DOM数据的方法 public static Document getDOM(File file)throws Exception{ // 3.1 获取解析器 DocumentBuilder parser = getParser(); // 3.2解析数据 Document dom = parser.parse(file); return dom; }
4. 获取根元素 // 4. 提供解析根元素的数据的方法 public static void getRoot(File file)throws Exception{ // 4.1 获取DOM树 Document dom = getDOM(file); // 4.2遍历dom树找根元素 Node node = dom.getElementsByTagName("users").item(0); // 4.3输出根元素的名 System.out.println(node.getNodeName()); }
5. 通过关系获取根元素 // 4. 提供解析根元素的数据的方法 public static void getRoot(File file)throws Exception{ // 4.1 获取DOM树 Document dom = getDOM(file); // 4.2遍历dom树找根元素 Node node = dom.getElementsByTagName("users").item(0); // 4.3输出根元素的名 System.out.println(node.getNodeName()); // 4.4根据节点直接的关系获取根元素 NodeList list = dom.getChildNodes(); Node root = list.item(0); System.out.println(root.getNodeName()); root = dom.getFirstChild(); System.out.println(root.getNodeName()); root = dom.getLastChild(); System.out.println(root.getNodeName()); }
6. 添加元素 // 5. 添加一个user节点 public static Document addElement(File file)throws Exception{ // 5.1获取DOM树 Document dom = getDOM(file); // 5.2创建user元素 Element user = dom.createElement("user"); Element name = dom.createElement("name"); Element age = dom.createElement("age"); Element address = dom.createElement("address"); name.setTextContent("焦宁波"); age.setTextContent("28"); address.setTextContent("天河区"); // 5.3建立关系 Element root = (Element) dom.getFirstChild(); user.appendChild(name); user.appendChild(age); user.appendChild(address); root.appendChild(user); // 5.4返回修改后的DOM树对象 return dom; }
7. 为了让内存中的修改的DOM树持久化到磁盘文件需要定义以下方法 // 提供一个工具方法将内存中的DOM树存储到磁盘的指定文件中 public static void writeDOM2XML(Document dom,File file) throws Exception{ // 1.获取转换器的工厂类对象 TransformerFactory factory = TransformerFactory.newInstance(); // 2.获取转换器对象 Transformer trans = factory.newTransformer(); // 3.转换 trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file))); }
8. 修改元素 // 6. 修改第二个user的年龄为30岁 public static Document modifyElement(File file)throws Exception{ // 6.1获取DOM树 Document dom = getDOM(file); // 6.2获取第二个age元素 Node age2 = dom.getElementsByTagName("age").item(1); // 6.3设置文本值 age2.setTextContent("30"); return dom; }
9. 删除元素 // 7. 删除第一个user节点 public static Document removeElement(File file)throws Exception{ // 7.1获取DOM树 Document dom = getDOM(file); // 7.2获取user的父亲 Node users = dom.getFirstChild(); // 7.2获取需要断绝关系的孩子节点 Node user1 = dom.getElementsByTagName("user").item(0); // 7.3断绝关系 users.removeChild(user1); return dom;
10. 加强使用关系获取元素 // 8. 使用关系获取节点 public static void searchElement(File file)throws Exception{ // 8.1获取DOM树 Document dom = getDOM(file); // 8.2获取第二个user的所有的子元素并输入元素名 Element user2 = (Element) dom.getElementsByTagName("user").item(1); // 8.3获取所有的儿子 NodeList list = user2.getChildNodes(); // 8.4遍历所有的孩子 for(int i = 0;i<list.getLength();i++){ Node node = list.item(i); System.out.println(node.getNodeName()); } // 8.5获取第二个user的address元素 Element address2 = (Element) list.item(2); System.out.println(address2.getNodeName()); Node age2 = address2.getPreviousSibling(); System.out.println(age2.getNodeName()); Element name2 = (Element) list.item(0); System.out.println(name2.getNodeName()); age2 = name2.getNextSibling(); System.out.println(age2.getNodeName()); }
11. 属性的操作 // 9. 属性操作 public static Document optionAttribute(File file)throws Exception{ // 9.1获取DOM树 Document dom = getDOM(file); // 9.2获取所有的user元素 NodeList list = dom.getElementsByTagName("user"); // 9.3遍历节点 for (int i = 0; i < list.getLength(); i++) { Element user = (Element)list.item(i); // 添加属性 user.setAttribute("id", "00"+(i+1)); } // 9.4 获取属性 Element user2 = (Element) list.item(1); String value = user2.getAttribute("id"); System.out.println(value); // 9.5修改属性 user2.setAttribute("id", "007"); // 9.5删除属性 user2.removeAttribute("id"); return dom; } 总结:在实际的项目开发中我们经常遇到的XML数据时比较大的,如果使用DOM进行数据的解析,那么首先在内存中会形成一个DOM树结构。因此容易导致内存的一个溢出。所以不建议大家使用DOM解析进行操作较大的XML数据。如果只是需要进行XML文件的数据获取,那么推荐使用SAX解析。
时间: 2024-10-06 15:25:12