一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识。看到了xml解析,目前我还没用到过。但多了解一下,加深点记忆和理解也无害处,权当复习吧。
在此只写下常见的三种XML解析方法,即DOM解析、SAX解析、DOM4J解析。
先上一份xml文件,关于xml文件的格式和创建方法,在此不多说了。
1 <?xml version="1.0" encoding="utf-8"?> 2 <root> 3 <class name="class1"> 4 <student> 5 <name>张三</name> 6 <age>20</age> 7 <sex>男</sex> 8 </student> 9 <student> 10 <name>Andy</name> 11 <age>22</age> 12 <sex>female</sex> 13 </student> 14 </class> 15 <class name="class2"> 16 <student> 17 <name>李四</name> 18 <age>15</age> 19 <sex>男</sex> 20 </student> 21 <student> 22 <name>bigbang</name> 23 <age>21</age> 24 <sex>女</sex> 25 </student> 26 </class> 27 </root>
DOM解析是一种消耗内存的解析方法,它先将整个xml文档装入内存,然后顺序读取,解析也是有些复杂,具体的操作都在注释中,不多说了。
1 import java.io.IOException; 2 import java.util.ArrayList; 3 import java.util.List; 4 5 import javax.xml.parsers.DocumentBuilder; 6 import javax.xml.parsers.DocumentBuilderFactory; 7 import javax.xml.parsers.ParserConfigurationException; 8 9 import org.w3c.dom.Document; 10 import org.w3c.dom.Element; 11 import org.w3c.dom.Node; 12 import org.w3c.dom.NodeList; 13 import org.xml.sax.SAXException; 14 15 import com.entity.Student; 16 17 public class DOMParse { 18 19 private Student student; 20 private List<Student> students; 21 22 public void pasre() { 23 students = new ArrayList<Student>(); 24 try { 25 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 26 DocumentBuilder builder = dbf.newDocumentBuilder(); 27 // 在此没有使用InputStream作为参数,直接引用文件路径。 28 Document doc = builder.parse("src/com/parseDom/test.xml"); 29 // 获取整个document元素 30 Element element = doc.getDocumentElement(); 31 // 获取所有<class>子节点 32 NodeList list = element.getElementsByTagName("class"); // <class> 33 // 遍历class子节点 34 for (int i = 0; i < list.getLength(); i++) { 35 Element el = (Element) list.item(i); 36 // 获取<student>节点 37 NodeList stus = el.getElementsByTagName("student"); // <student> 38 // 遍历student子节点 39 for (int j = 0; j < stus.getLength(); j++) { 40 /** 41 * 获取student下所有子节点 此处有7个节点,分别是#text<name> #text<sex> 42 * #text<age> #text 43 * 对应的xml实际是<student>、<name>、#name、<sex>、#sex 44 * 、<age>、#age这七个子节点 45 * **/ 46 NodeList lis = stus.item(j).getChildNodes(); 47 // 每个student节点输出就是一个Student对象 48 student = new Student(); 49 for (int k = 0; k < lis.getLength(); k++) { 50 // 当元素为节点元素时(非textValue),对比后取值 51 if (lis.item(k).getNodeType() == Node.ELEMENT_NODE) { 52 if ("name".equals(lis.item(k).getNodeName())) { // <name> 53 student.setName(lis.item(k).getFirstChild().getNodeValue()); 54 } 55 if ("sex".equals(lis.item(k).getNodeName())) { // <sex> 56 student.setSex(lis.item(k).getFirstChild().getNodeValue()); 57 } 58 if ("age".equals(lis.item(k).getNodeName())) { // <age> 59 student.setAge(Integer.parseInt(lis.item(k).getFirstChild().getNodeValue())); 60 } 61 } 62 } 63 students.add(student); 64 } 65 } 66 67 } catch (ParserConfigurationException e) { 68 e.printStackTrace(); 69 } catch (SAXException e) { 70 e.printStackTrace(); 71 } catch (IOException e) { 72 e.printStackTrace(); 73 } finally { 74 for (Student stus : students) { 75 System.out.println(stus.getName() + "--" + stus.getSex() + "--" + stus.getAge()); 76 } 77 } 78 } 79 80 public static void main(String[] args) { 81 DOMParse domParse = new DOMParse(); 82 domParse.pasre(); 83 } 84 }