java基礎-使用dom4j解析XML檔案
阿新 • • 發佈:2019-02-02
一
解析XML
解析過程
/*
* 解析XML檔案的基本流程* 1:建立SAXReader,用來讀取XML
* 檔案
* 2:指定xml檔案使得SAXReader讀取,
* 並解析問文件物件Document
* 3:獲取根元素
* 4:獲取每一個元素,從而達到解析的
* 目的。
*/
程式碼
1.1
用到的輔助類
package demoXml; /** * 該類用於描述emp.xml檔案中表示的員工 * @author Administrator * */ public class Emp { private int id; private String name; private int age; private String gender; private int salary; public Emp(int id, String name, int age, String gender, int salary) { super(); this.id = id; this.name = name; this.age = age; this.gender = gender; this.salary = salary; } /** * 無參的構造方法: * 當我們沒有定義構造方法時,編譯器會自動 * 幫我們新增一個預設的構造方法。 * 預設構造方法: * 無引數,且沒有任何實現程式碼。如下。 * 若我們定義過任何構造方法,編譯器不會為 * 我們新增該預設構造方法,若需要,則手動 * 書寫 */ public Emp(){ } 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 getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public String toString(){ return id+","+name+","+age+","+gender+","+salary; } }
1.2
解析程式碼
二package demoXml; import java.io.File; import java.util.ArrayList; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 使用DOM解析XML檔案 * @author Administrator * */ public class XMLDemo1 { public static void main(String []args){ try{ /* * 解析XML檔案的基本流程 * 1:建立SAXReader,用來讀取XML * 檔案 * 2:指定xml檔案使得SAXReader讀取, * 並解析問文件物件Document * 3:獲取根元素 * 4:獲取每一個元素,從而達到解析的 * 目的。 */ //1 //org.dom4j.xxxx SAXReader reader = new SAXReader(); //2 /* * 常用的讀取方法 * Document read(InputStream in) * Document read(Reader read) * Document read(File file) */ File xmlFile = new File("emp.xml"); //2 /* * read方法的作用: * 讀取給定的xml,並將其解析轉換為 * 一個Document物件。 * 實際上這裡已經完成了對整個xml * 解析的工作。並將所有內容封裝到了 * Document物件中。 * Document物件可以描述當前xml文件 */ Document doc = reader.read(xmlFile); //3 Element root = doc.getRootElement(); //4 /* * Element element(String name) * 獲取當前標籤下第一個名為給定 * 名字的標籤 * * List elements(String name) * 獲取當前標籤下所有給定名字的 * 標籤 * * List elements() * 獲取當前標籤下的所有子標籤。 */ List<Element> elements = root.elements(); /* * 建立一個集合,用於儲存xml中 * 的每一個使用者資訊。我們先將 * 使用者資訊取出,然後建立一個Emp * 例項,將資訊設定到該例項的相應 * 屬性上。最終將所有emp物件存入 * 該集合。 */ List<Emp> list = new ArrayList<Emp>(); /* * 遍歷每一個emp標籤 */ for(Element emp : elements){ //建立一個Emp物件,用於儲存資訊 Emp e = new Emp(); //解析emp標籤 //獲取name的值 /* * 首先,獲取名為"name"的子標籤 * 其次,獲取前後標籤中間的文字 */ Element ename = emp.element("name"); String name = ename.getText(); //獲取年齡 /* * String elementText(String name) * 獲取當前標籤中名為給定名字的子標籤 * 中間的文字 * 該方法與上面獲取“name”的兩句話等效 */ String ageStr = emp.elementText("age"); int age = Integer.parseInt(ageStr); //解析性別 String gender = emp.elementText("gender"); //解析工資 int salary = Integer.parseInt( emp.elementText("salary") ); e.setAge(age); e.setName(name); e.setGender(gender); e.setSalary(salary); /* * 通過Element獲取元素屬性 * * Attribute attribute(String name) * 獲取當前標籤中指定名字的屬性 */ //獲取id屬性 Attribute attr = emp.attribute("id"); //獲取該屬性的值 /* * Attribute表示一個屬性,常用方法: * * String getValue() * 獲取該屬性的值 * * String getName() * 獲取該屬性的名字 */ int id =Integer.parseInt( attr.getValue() ); e.setId(id); //將Emp物件存入集合 list.add(e); } System.out.println( "解析了"+list.size()+ "個員工資訊"); //輸出每一個員工資訊 for(Emp e : list){ System.out.println(e); } }catch(Exception e){ } } }
寫入XML
package demoXml; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.XMLWriter; /** * 使用DOM寫出一個XML * @author Administrator * */ public class XMLDemo2 { public static void main(String[] args){ List<Emp> list = new ArrayList<Emp>(); list.add( new Emp(1,"jack",33,"男",5000) ); list.add( new Emp(2,"boss",55,"男",55000) ); list.add( new Emp(3,"marry",22,"女",3500) ); list.add( new Emp(4,"kate",25,"女",6000) ); list.add( new Emp(5,"tom",32,"男",8500) ); /* * 生成一個xml的基本步驟 * 1:建立文件物件Document * 2:為Document新增根節點 * 3:為根節點組建樹狀結構 * 4:建立XMLWriter * 5:為XMLWriter指定寫出目標 * 6:寫出xml */ //1 //通過DocumentHelper建立Document物件 Document doc = DocumentHelper.createDocument(); //2 /* * Document的方法 * Element addElement(String name) * 該方法用於向文件中新增給定名字的 * 根元素,返回的Element例項就表示該 * 根元素 * 需要注意的是,該方法只能呼叫一次。 * 呼叫第二次會丟擲異常。 */ Element root = doc.addElement("list"); /* * 迴圈新增每一個員工資訊 */ for(Emp e : list){ /* * Element同樣支援方法: * Element addElement(String name) * 向當前標籤中新增給定名字的子標籤 */ //向根標籤中新增emp標籤 Element emp = root.addElement("emp"); //向emp標籤中新增子標籤name Element name = emp.addElement("name"); name.addText(e.getName()); //向emp標籤中新增子標籤age emp.addElement("age") .addText(e.getAge()+""); emp.addElement("gender") .addText(e.getGender()); emp.addElement("salary") .addText(e.getSalary()+""); /* * 為標籤新增屬性 * Element addAttribute( * String name,String value * ) * 為當前標籤新增給定名字以及對應值的 * 屬性 * 返回值仍然為當前標籤。 * 這樣做的目的是可以連續新增若干屬性 * 就好像StringBuilder的append的 * 返回值效果和作用。 */ emp.addAttribute("id",e.getId()+""); } /* * 當退出迴圈後,那麼Document中的 * 結構就已經構建完了 * 需要將其寫出為xml */ try{ XMLWriter writer = new XMLWriter(); FileOutputStream out = new FileOutputStream( "myemp.xml"); writer.setOutputStream(out); /* * 將Document物件寫出到檔案中 * 這時會將Document轉換為xml格式 * 寫入檔案。 */ writer.write(doc); writer.close(); }catch(Exception e){ } } }
三
DOM4J對XPATH的支援
package demoXml;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* DOM4J對XPATH的支援
* @author Administrator
*
*/
public class XMLDemo3 {
public static void main(String[] args){
try{
//讀取xml檔案轉換為Document
SAXReader reader
= new SAXReader();
Document doc
= reader.read(
new File("myemp.xml")
);
String path
= "/list/emp[gender='女']" +
"/salary[.>4000]";
/*
* List selectNodes(String xpath)
* 根據給定的XPATH查詢對應的節點
*/
List list
= doc.selectNodes(path);
for(Object o : list){
Element e = (Element)o;
System.out.println(e.getText());
}
}catch(Exception e){
e.printStackTrace();
}
}
}