Java如何基于DOM解析xml文件
一、Java解析xml、解析xml四種方法、DOM、SAX、JDOM、DOM4j、XPath
此文針對其中的DOM方法具體展開介紹及代碼分析
sax、dom是兩種對xml文檔進行解析的方法(沒有具體實現(xiàn),只是接口),所以只有它們是無法解析xml文檔的;jaxp只是api,它進一步封裝了sax、dom兩種接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默認使用xerces解釋器)。如果是嵌入式的情況下建議使用sax方法進行解析,因為它不需要一下子把數(shù)據(jù)都保存到內存中然后再解析是可以逐步解析的。而DOM不行,必須一次性把數(shù)據(jù)存到內存中,然后一并解析。這樣做雖然速度會很快,但是同時也加大了對內存的消耗。如果文件很大的情況下不建議DOM解析。
二、【DOM 簡單使用介紹】
1、【DOM(Document Object Model) 】
由W3C提供的接口,它將整個XML文檔讀入內存,構建一個DOM樹來對各個節(jié)點(Node)進行操作。
下面一段是DOM解析xml的一個案例一起來看一下。
【xml原文件】
<?xml version = "1.0" encoding = "UTF-8"?> <staffs> <staff id="1"> <name>Tom_zhang1</name> <age>19</age> <sex>男</sex> <phone>18677435526</phone> <group> <id>1</id> <name>Technical department</name> </group> </staff> <staff id="2"> <name>Susy_wang</name> <age>18</age> <sex>女</sex> <phone>18962459987</phone> <group> <id>2</id> <name>Financial department</name> </group> </staff> <staff id="3"> <name>Jack_Ma</name> <age>45</age> <sex>男</sex> <phone>1867755334</phone> <group> <id>3</id> <name>Financial department</name> </group> </staff> </staffs>
【代碼】
Staff 類
package Entity; public class Staff { private int id; private String name; private int age; private String sex; private String phone; private StuGroup group; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public StuGroup getGroup() { return group; } public void setGroup(StuGroup group) { this.group = group; } public Staff() { super(); // TODO Auto-generated constructor stub } public Staff(int id, String name, int age, String sex, String phone, StuGroup group) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.phone = phone; this.group = group; } @Override public String toString() { return "Staff [age=" + age + ", group=" + group + ", id=" + id + ", name=" + name + ", phone=" + phone + ", sex=" + sex + "]"; } }
Group 類
package Entity; public class Group { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Group() { super(); // TODO Auto-generated constructor stub } public Group(int id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Group [id=" + id + ", name=" + name + "]"; } }
注釋: Staff類不需解釋,xml文件中有幾個<>就需要創(chuàng)建幾個字段。Group類的創(chuàng)建是因為group本身又是一個節(jié)點,它有它自己的字段。因此在這邊把這種情況單獨作為一個類創(chuàng)建,同時也方便日后維護管理。依次類推如果有更多的子類,方法一樣創(chuàng)建相應的類即可。
無論是DOM解析還是SAX解析,都是通過一個叫做Parser的解釋器,來對xml文件進行解析。而這個解析器是需要我們手動創(chuàng)建的,接下來就一起來看一下解釋器中的代碼,也是最主要的代碼。
Dom_parser(解析器)
package Parser; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import Entity.StuGroup; import Entity.Staff; public class Dom_parser { public static List<Staff> parser(String fileName) { List<Staff> staffs = new ArrayList<Staff>(); //創(chuàng)建一個ArrayList來裝數(shù)據(jù) DocumentBuilderFactory factory = null; //DocumentBuilderFactory,DocumentBuilder,Document分別是DOM解析的工廠類 DocumentBuilder builder = null; Document doc = null; Staff staff = null; //方便日后實例化 StuGroup group = null; //同上 try { factory = DocumentBuilderFactory.newInstance(); //工廠類實例化 builder = factory.newDocumentBuilder(); //工廠類實例化 doc = builder.parse(new File(fileName)); //通過.parser方法加載文件 Element root = doc.getDocumentElement(); //Element方法中的.getDocumentElement()代表獲取xml文件的頭文件內容 NodeList nodelist = root.getElementsByTagName("staff"); //獲取TagName,每一個<>中的字段為一個TagName.作為一個nodelist來保存 //循環(huán)這個NodeList,然后得到每個nodelist中的item。根據(jù)獲取到的值的索引最終通過.set方法得到這個值 for (int index = 0; index < nodelist.getLength(); index++) { staff = new Staff(); Node node = nodelist.item(index); staff.setId(Integer.parseInt(node.getAttributes().getNamedItem( "id").getTextContent())); // System.out.println(staff); NodeList childNode = node.getChildNodes(); //設置一個childNode為了存放nodelist下子<>中的TagName //同上循環(huán)子childNode這個list,獲取到每個元素的下標。再通過.set方法分別得到每個元素的值。 for (int i = 0; i < childNode.getLength(); i++) { Node childitem = childNode.item(i); if (childitem.getNodeName().equals("name")) { staff.setName(childitem.getTextContent()); } else if (childitem.getNodeName().equals("age")) { staff.setAge(Integer.parseInt(childitem .getTextContent())); } else if (childitem.getNodeName().equals("sex")) { staff.setSex(childitem.getTextContent()); } else if (childitem.getNodeName().equals("phone")) { staff.setPhone(childitem.getTextContent()); } else if (childitem.getNodeName().equals("group")) { NodeList groupnode = childitem.getChildNodes(); for (int j = 0; j < groupnode.getLength(); j++) { Node groupitem = groupnode.item(j); if (groupitem.getNodeName().equals("id")) { group = new StuGroup(); //這里的實例化很重要,切記不要實例化錯誤地方 String groupId = groupitem.getTextContent(); group.setId(Integer.parseInt(groupId)); staff.setGroup(group); } else if (groupitem.getNodeName().equals("name")) { String groupName = groupitem.getTextContent(); group.setName(groupName); staff.setGroup(group); } } } } staffs.add(staff); //最終我們要把staff這個對象追加到staffs這個集合中。 } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return staffs; //返回這個集合 } }
【測試類】
package Parser; import java.util.List; import Entity.Staff; public class Test { public static void main(String[] args) { String file = "C:/Users/IBM_ADMIN/Desktop/xml/staff.xml"; //指定文件地址 List<Staff> staffs = Dom_parser.parser(file); //因為我們創(chuàng)建的解析器的名字叫Dom_parser所以在這里調用Dom_parser.parser()方法。()中參數(shù)為文件地址。 //循環(huán)并打印結果 for(Staff list:staffs){ System.out.println(list); } } }
【打印結果】
打印結果如下??梢钥吹絰ml中每個TageName以及對應的值,通過DOM解析的方式把結果都一一的被獲取并打印出來了。
目前我們是把數(shù)據(jù)放到了ArrayList內存中。后續(xù)可以把數(shù)據(jù)存放到數(shù)據(jù)庫中。
Staff [age=19, group=Group [id=1, name=Technical department], id=1, name=Tom_zhang1, phone=18677435526, sex=男]
Staff [age=18, group=Group [id=2, name=Financial department], id=2, name=Susy_wang, phone=18962459987, sex=女]
Staff [age=45, group=Group [id=3, name=Financial department], id=3, name=Jack_Ma, phone=1867755334, sex=男]
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot整合Redis實現(xiàn)緩存分頁數(shù)據(jù)查詢功能
類似淘寶首頁,這些商品是從數(shù)據(jù)庫中查出來的嗎,答案肯定不是,本文我們就通過一個案例實操一下,首頁熱點數(shù)據(jù)怎么放到Redis中去查詢,感興趣的同學可以參考一下2023-06-06Java-ElementUi中的row-class-name使用
這篇文章主要介紹了Java-ElementUi中的row-class-name使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Springboot集成JSR303參數(shù)校驗的方法實現(xiàn)
這篇文章主要介紹了Springboot集成JSR303參數(shù)校驗的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09jpa?onetomany?使用級連表刪除被維護表數(shù)據(jù)時的坑
這篇文章主要介紹了jpa?onetomany?使用級連表刪除被維護表數(shù)據(jù)時的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12