dom 解析xml文件

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中的事件机制

  1. 编写需要解析的XML文件
  2. 获取相应的XML解析器对象
  3. 使用API获取数据
  4. 返回数据给开发者

其中回车换行也算是一个元素,所以底下xml文件中的users节点有个节点,其中3个为#text的打印

1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <users>
3     <user>
4         <name>jack</name>
5         <age>26</age>
6         <address>gz</address>
7     </user>
8     <user><name>二货</name><age>28</age><address>天河区</address></user>
9 </users>
  1 import org.w3c.dom.Document;
  2 import org.w3c.dom.Element;
  3 import org.w3c.dom.Node;
  4 import org.w3c.dom.NodeList;
  5 
  6 public class Demo1 {
  7 
  8     // 2. 提供获取解析器的方法
  9     public static DocumentBuilder getParser()throws Exception{
 10         // 2.1  创建工厂类对象
 11         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 12         // 2.2 获取解析器对象
 13         DocumentBuilder parser = factory.newDocumentBuilder();
 14         return parser;
 15     }
 16     
 17     // 3. 提供获取DOM数据的方法
 18     public static Document getDOM(File file)throws Exception{
 19         // 3.1 获取解析器
 20         DocumentBuilder parser = getParser();
 21         // 3.2解析数据
 22         Document dom = parser.parse(file);
 23         return dom;
 24     }
 25     
 26     // 4. 提供解析根元素的数据的方法
 27     public static void getRoot(File file)throws Exception{
 28         // 4.1 获取DOM树
 29         Document dom = getDOM(file);
 30         // 4.2遍历dom树找根元素
 31         Node node = dom.getElementsByTagName("users").item(0);
 32         // 4.3输出根元素的名
 33         System.out.println(node.getNodeName());
 34         // 4.4根据节点直接的关系获取根元素
 35         NodeList list = dom.getChildNodes();
 36         Node root = list.item(0);
 37         System.out.println(root.getNodeName());
 38         root = dom.getFirstChild();
 39         System.out.println(root.getNodeName());
 40         root = dom.getLastChild();
 41         System.out.println(root.getNodeName());
 42     }
 43     
 44     // 5. 添加一个user节点
 45     public static Document addElement(File file)throws Exception{
 46         // 5.1获取DOM树
 47         Document dom = getDOM(file);
 48         // 5.2创建user元素
 49         Element user = dom.createElement("user");
 50         Element name = dom.createElement("name");
 51         Element age = dom.createElement("age");
 52         Element address = dom.createElement("address");
 53         
 54         name.setTextContent("焦宁波");
 55         age.setTextContent("28");
 56         address.setTextContent("天河区");
 57         // 5.3建立关系
 58         Element root = (Element) dom.getFirstChild();
 59         user.appendChild(name);
 60         user.appendChild(age);
 61         user.appendChild(address);
 62         root.appendChild(user);
 63         // 5.4返回修改后的DOM树对象
 64         return dom;
 65     } 
 66     
 67     // 6. 修改第二个user的年龄为30岁
 68     public static Document modifyElement(File file)throws Exception{
 69         // 6.1获取DOM树
 70         Document dom = getDOM(file);
 71         // 6.2获取第二个age元素
 72         Node age2 = dom.getElementsByTagName("age").item(1);
 73         // 6.3设置文本值
 74         age2.setTextContent("30");
 75         return dom;
 76     }
 77     
 78     // 7. 删除第一个user节点
 79     public static Document removeElement(File file)throws Exception{
 80         // 7.1获取DOM树
 81         Document dom = getDOM(file);
 82         // 7.2获取user的父亲
 83         dom.getElementsByTagName("user").item(0).getParentNode().removeChild(dom.getElementsByTagName("user").item(0));
 84         return dom;
 85     }
 86     
 87     // 8. 使用关系获取节点
 88     public static void searchElement(File file)throws Exception{
 89         // 8.1获取DOM树
 90         Document dom = getDOM(file);
 91         // 8.2获取第二个user的所有的子元素并输入元素名
 92         Element user2 = (Element) dom.getElementsByTagName("user").item(1);
 93         // 8.3获取所有的儿子
 94         NodeList list = user2.getChildNodes();
 95         // 8.4遍历所有的孩子
 96         for(int i = 0;i<list.getLength();i++){
 97             Node node = list.item(i);
 98             System.out.println(node.getNodeName());
 99         }
100         // 8.5获取第二个user的address元素
101         Element address2 = (Element) list.item(2);
102         System.out.println(address2.getNodeName());
103         Node age2 = address2.getPreviousSibling();
104         System.out.println(age2.getNodeName());
105         
106         Element name2 = (Element) list.item(0);
107         System.out.println(name2.getNodeName());
108         age2 = name2.getNextSibling();
109         System.out.println(age2.getNodeName());
110         
111     }
112     
113     
114     // 提供一个工具方法将内存中的DOM树存储到磁盘的指定文件中
115     public static void writeDOM2XML(Document dom,File file)throws Exception{
116         // 1.获取转换器的工厂类对象
117         TransformerFactory factory = TransformerFactory.newInstance();
118         // 2.获取转换器对象
119         Transformer trans = factory.newTransformer();
120         // 3.转换
121         trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file)));
122     } 
123     
124     
125     public static void main(String[] args) throws Exception{
126        File file = new File("users.xml");
127        //getRoot(file);
128        //Document dom = addElement(file);
129        //Document dom = modifyElement(file);
130        //Document dom = removeElement(file);
131        //writeDOM2XML(dom, file);
132        searchElement(file);
133        
134     }
135 
136 }
原文地址:https://www.cnblogs.com/friends-wf/p/3723523.html