Java解析XML檔案的常用方法介紹
XML是一個可擴充套件標記語言。很多時候我們需要進行資料交換,同時也存在跨平臺使用,XML檔案對這些需求提供了很好的幫助!
對於Java來說,XML常見的用途就是儲存資料和配置,這就涉及了對XML檔案的增刪改查操作!
Java常見的XML解析方式分為DOM解析、SAX解析、DOM4j解析,下面是這三種解析方式的優缺點:
1、DOM解析
方便遍歷,隨機訪問某一個節點,修改XML。缺點是一次性讀取到記憶體。
2、SAX解析
從上至下一個個節點去解析,觸發事件(呼叫相應的方法)來進行處理。不能對xml進行修改。佔用記憶體小。
3、DOM4j
第三方的開源的解析工具,方便使用。
XML檔案:(src/name.xml)
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <names> 3<name id="張三"> 4<age>20</age> 5</name> 6<name id="李四"> 7<age>25</age> 8</name> 9<name id="王五"> 10<age>30</age> 11</name> 12 </names>
下面我就來介紹DOM和DOM4j來解析上面的XML檔案的方法:
DOM解析:
1 import java.io.IOException; 2 3 import javax.xml.parsers.DocumentBuilder; 4 import javax.xml.parsers.DocumentBuilderFactory; 5 import javax.xml.parsers.ParserConfigurationException; 6 import javax.xml.transform.Transformer; 7 import javax.xml.transform.TransformerConfigurationException; 8 import javax.xml.transform.TransformerException; 9 import javax.xml.transform.TransformerFactory; 10 import javax.xml.transform.dom.DOMSource; 11 import javax.xml.transform.stream.StreamResult; 12 13 import org.w3c.dom.Document; 14 import org.w3c.dom.Element; 15 import org.w3c.dom.Node; 16 import org.w3c.dom.NodeList; 17 import org.xml.sax.SAXException; 18 19 public class DOM { 20 21public static void main(String[] args) { 22// TODO Auto-generated method stub 23try { 24DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 25// 建立DOM解析器工廠 26DocumentBuilder db = dbf.newDocumentBuilder(); 27// 呼叫DOM解析器工廠的newDocumentBuilder()方法得到DOM解析器物件 28Document doc = db.parse("src\\name.xml"); 29// 呼叫DOM解析器物件parse(String uri)方法得到Document物件 30NodeList nl = doc.getElementsByTagName("name"); 31// 呼叫Document物件的getElementsByTagName(String tagname)方法得到NodeList物件 32/* 33* 遍歷XML中的元素 34*/ 35for (int i = 0; i < nl.getLength(); i++) { 36Node node = nl.item(i); 37// 通過NodeList的item(int index)方法得到NodeList中的Node物件 38Element element = (Element) node; 39// 通過Node物件強制轉換的方法得到Element物件 40String id = element.getAttribute("id"); 41// 通過Element物件的getgetAttribute(String name)方法得到id屬性值 42System.out.println(id); 43// 列印id屬性值 44String age = element.getElementsByTagName("age").item(0).getTextContent(); 45// 通過Element物件的getElementsByTagName(String name)方法得到age的屬性值 46System.out.println(age); 47// 列印age 48} 49/* 50* 新增元素到XML中 51*/ 52Element root = doc.getDocumentElement(); 53// 通過Document物件的getDocumentElement()方法得到根節點 54Element newname = doc.createElement("name"); 55// 通過Document物件的createElement(String tagName)方法得到新的name元素 56newname.setAttribute("id", "小明"); 57// 通過呼叫Element物件的setAttribute(String name,String value)方法為id賦值 58Element newage = doc.createElement("age"); 59// 通過Document物件的createElement(String tagName)方法得到新的age元素 60newage.setTextContent("18"); 61// 通過呼叫Element物件的setTextContent(String textContent)方法為age賦值 62newname.appendChild(newage); 63// 新增age到name中 64root.appendChild(newname); 65// 新增name到根節點中 66/* 67* 修改XML中的元素 68*/ 69for (int i = 0; i < nl.getLength(); i++) { 70Element fixname = (Element) nl.item(i); 71// 得到要修改的Element物件 72String fixnewname = fixname.getAttribute("id"); 73// 獲取到要修改物件的id屬性值 74/* 75* 判斷name是否為要修改的物件 76*/ 77if (fixnewname.equals("小明")) { 78Element sex = doc.createElement("sex"); 79// 建立新的Element物件 80sex.setAttribute("sex", "男"); 81// 給新的Element物件的屬性賦值 82fixname.appendChild(sex); 83// 新增新的Element(sex)物件到Element(fixname)物件中 84} 85} 86/* 87* 刪除XML中的元素 88*/ 89root.removeChild(root.getChildNodes().item(7)); 90// 首先通過根節點訪問子節點,得到Node物件,然後呼叫根節點的removeChild(Node oldChild)方法刪除元素 91/* 92* 將更改寫入到XML檔案中 93*/ 94TransformerFactory tf = TransformerFactory.newInstance(); 95// 呼叫TransformerFactory的newInstance()方法得到TransformerFactory物件 96Transformer t = tf.newTransformer(); 97// 呼叫TransformerFactory物件的newTransformer()方法得到Transformer物件 98t.transform(new DOMSource(doc), new StreamResult("src\\name.xml")); 99// 呼叫Transformer物件的transform(Source xmlSource,Result 100// outputTarget)方法將修改寫入到name.xml檔案中 101} catch (ParserConfigurationException e) { 102// TODO Auto-generated catch block 103e.printStackTrace(); 104} catch (SAXException e) { 105// TODO Auto-generated catch block 106e.printStackTrace(); 107} catch (IOException e) { 108// TODO Auto-generated catch block 109e.printStackTrace(); 110} catch (TransformerConfigurationException e) { 111// TODO Auto-generated catch block 112e.printStackTrace(); 113} catch (TransformerException e) { 114// TODO Auto-generated catch block 115e.printStackTrace(); 116} 117} 118 119 }
遍歷執行結果:
1 張三 2 20 3 李四 4 25 5 王五 6 30
新增執行結果:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <names> 3<name id="張三"> 4<age>20</age> 5</name> 6<name id="李四"> 7<age>25</age> 8</name> 9<name id="王五"> 10<age>30</age> 11</name> 12<name id="小明"> 13<age>18</age> 14</name> 15 </names>
修改執行結果:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <names> 3<name id="張三"> 4<age>20</age> 5</name> 6<name id="李四"> 7<age>25</age> 8</name> 9<name id="王五"> 10<age>30</age> 11</name> 12<name id="小明"> 13<age>18</age> 14<sex sex="男" /> 15</name> 16 </names>
刪除執行結果:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <names> 3<name id="張三"> 4<age>20</age> 5</name> 6<name id="李四"> 7<age>25</age> 8</name> 9<name id="王五"> 10<age>30</age> 11</name> 12 </names>
DOM4j解析:
使用DOM4j解析需要新增第三方工具包,具體網址:dom4j.github.io/" rel="nofollow,noindex" target="_blank">DOM4j
1 import org.dom4j.Document; 2 import org.dom4j.DocumentException; 3 import org.dom4j.Element; 4 import org.dom4j.io.SAXReader; 5 import org.dom4j.io.XMLWriter; 6 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.UnsupportedEncodingException; 11 import java.util.List; 12 13 public class DOM4j { 14 15public static void main(String[] args) { 16// TODO Auto-generated method stub 17try { 18// 遍歷 19SAXReader sr = new SAXReader(); 20Document doc = sr.read("src\\name.xml"); 21Element root = doc.getRootElement(); 22List<Element> name = root.elements("name"); 23for (Element names : name) { 24System.out.println(names.attributeValue("id")); 25List<Element> age = names.elements("age"); 26for (Element ages : age) { 27System.out.println(ages.getText()); 28} 29} 30// 新增 31Element newname = root.addElement("name"); 32newname.addAttribute("id", "小明"); 33Element newage = newname.addElement("age"); 34newage.setText("18"); 35//刪除 36root.remove(name.get(3)); 37// 寫入 38XMLWriter xw = new XMLWriter(new FileOutputStream("src\\name.xml")); 39xw.write(doc); 40} catch (DocumentException e) { 41// TODO Auto-generated catch block 42e.printStackTrace(); 43} catch (UnsupportedEncodingException e) { 44// TODO Auto-generated catch block 45e.printStackTrace(); 46} catch (FileNotFoundException e) { 47// TODO Auto-generated catch block 48e.printStackTrace(); 49} catch (IOException e) { 50// TODO Auto-generated catch block 51e.printStackTrace(); 52} 53} 54 55 }