XML文档解析
1.DOM4J概述:DOM4J是一个易用的、开源的库,可以实现对XML文档的解析
2.Document对象相关
读取XML文件,获得Document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new read(new File("input.xml")));
3.节点相关
(1)获取文档的根元素
Element rootElm = document.getRootElement();
(2)取得某节点的单个子节点
Element memberElm=root.element("member"); //“member”是节点名
(3)取得节点的文字
String text = memberElm.getText();
(4)取得某节点下名为“member”的所有字节点并进行遍历
List nodes = rootElm.elements("member");
for(Iterator it = nodes.iterator();it.hasNext();){
Element elm = (Element)it.next();
//.....
}
(5)对某节点下的所有字节点进行遍历
for(Iterator it=rooe.elementIterator();it.hasNext();){
Element element = (Element)it.next();
//......
}
(6)在某节点下添加字节点
Element ageElm = newMemberElm.addElement("age");
(7)设置节点文字
ageElm.setText("29");
(8)删除某节点
parentElm.remove(childElm); //childElm是待删除的节点,parentElm是其父节点
(9)添加一个CDATA节点
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
contentElm.getText(); //特别说明:获取节点的CDATA值与获取节点的值是同一个方法
contentElm.clearContent(); //清除节点中的内容,CDATA亦可
4.属性相关
(1)取得某节点下的某属性
Element root = document.getRootElement();
Attribute attribute = root.attribute("size"); //属性名name
(2)取得属性的文字
String text = attribute.getText();
(3)遍历某节点的所有属性
Element root = document.getRootElement();
for(Iterator it = root.attributeIterator();it.hasNext;){
Attribute attribute = (Attribute)it.next();
String text = attribute.getText();
System.out.print(text);
}
(4)设置某节点的属性和文字
newMemberElm.addAttribute("name","sitinspring");
(5)设置属性的文字
Attribute attribute = root.attribute("name");
attribute.setText("sitinspring");
5.使用DOM4J操作XML数据
1.实现步骤
导入DOM4J的jar包
指定要解析的XML文件
把XML文件转换成Document对象
获取节点属性或文本的值
2.使用DOM4j读取下面xml文档中所有的学生信息
student.xml
1 <?xml version="1.0" encoding="gb2312" ?> 2 <students> 3 <student age="25"> <!--如果没有age属性,默认值设置为20--> 4 <name>崔卫兵</name> 5 <college>PC学院</college> 6 <telephone>62354666</telephone> 7 <notes>男,1985年出生,硕士,现就读北京邮电大学</notes> 8 </student> 9 <student age="25"> 10 <name>张宏哲</name> 11 <college leader="leader">PC学院</college> <!--如果没有leader属性 默认为leader--> 12 <telephone>62354666</telephone> 13 <notes>男,1985年出生,硕士,现就读北京邮电大学</notes> 14 </student> 15 </students>
Dom4jReadExmple.java
1 public class Dom4jReadExmple { 2 3 /** 4 * 遍历整个xml文件,获取所有节点的值与其属性的值,并放入HashMap中 5 * @param filename 待遍历的XML文件(相对路径或者绝对路径) 6 * @param hm 存放遍历结果 7 */ 8 public void iterateWholeXML(String filename,HashMap<String,String> hm){ 9 SAXReader saxReader = new SAXReader(); 10 try { 11 Document document = saxReader.read(new File(filename)); 12 Element root = document.getRootElement(); 13 int num=-1; //用于记录学生编号的变量 14 //遍历根元素(students)的所有子节点(肯定是Student节点) 15 for (Iterator iter = root.elementIterator(); iter.hasNext();) { 16 Element element = (Element) iter.next(); 17 num++; 18 //获取person节点的age属性 19 Attribute ageAttr = element.attribute("age"); 20 if(ageAttr != null){ 21 String age = ageAttr.getValue(); 22 if(age != null&&!age.equals("")){ 23 hm.put(element.getName()+"-"+ageAttr.getName()+num, age); 24 }else{ 25 hm.put(element.getName()+"-"+ageAttr.getName()+num, "20"); 26 } 27 }else{ 28 hm.put(element.getName()+"-age"+num, "20"); 29 } 30 //遍历student节点的所有子节点(即name,college,telphone和notes) 31 for (Iterator iterInner=element.elementIterator(); iterInner.hasNext();) { 32 Element elementInner = (Element)iterInner.next(); 33 if(elementInner.getName().equals("college")){ 34 hm.put(elementInner.getName()+num, elementInner.getText()); 35 //获取college节点的leader属性的值 36 Attribute leaderAttr = elementInner.attribute("leader"); 37 if(leaderAttr != null){ 38 String leader = leaderAttr.getValue(); 39 if(leader != null&&!leader.equals("")){ 40 hm.put(elementInner.getName()+"-"+leaderAttr.getName()+num, leader); 41 }else{ 42 hm.put(elementInner.getName()+"-"+leaderAttr.getName()+num, leader); 43 } 44 }else{ 45 hm.put(elementInner.getName()+"-leader"+num, "leader"); 46 } 47 }else{ 48 hm.put(elementInner.getName()+num, elementInner.getText()); 49 } 50 } 51 } 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 } 56 }
TestDom4jReadExmple.java
1 public class TestDom4jReadExmple { 2 public static void main(String[] args) { 3 try { 4 //获取解析完成后的解析信息 5 HashMap<String, String> hashMap; 6 Dom4jReadExmple drb = new Dom4jReadExmple(); 7 //遍历整个XML文件 8 hashMap= new HashMap<String, String>(); 9 String n = System.getProperty("user.dir"); //获取当前工程真实路径 10 //studentInfo.xml保存学生信息,放在src目录下 11 drb.iterateWholeXML(n+"\src\studentInfo.xml", hashMap); 12 for (int i = 0; i < hashMap.size(); i+=6) { 13 int j=i/6; 14 System.out.println(hashMap.get("name"+j)+" "); 15 System.out.println(hashMap.get("student-age"+j)+" "); 16 System.out.println(hashMap.get("college"+j)+" "); 17 System.out.println(hashMap.get("college-leader"+j)+" "); 18 System.out.println(hashMap.get("telephone"+j)+" "); 19 System.out.println(hashMap.get("notes"+j)+" "); 20 } 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 }