解析方式:
DOM解析 直接性把XML文档全部读取到内存中来,会得到一个Document对象,然后对其访问操作,DOM方式W3C推荐的一种方式 (好处:增删改查方便)SAX解析 Simple API for XML,不是官方的标准,但他是XML领域事实上的标准 SAX是边读取XML文档,边解析XML的解析器
Crimson(SUN)Xerces(IBM -> Apache)Aelfred(JDOM, DOM4J)第三方解析工具 JDOM,DOM4J(常用)Java里面对XML的解析工具JAXP JAXP方式解析XML步骤:
//获取 DocumentBuilderFactory 实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //加载要解析的XML文档,获取Document对象 Document doc = db.parse(new FileInputStream("xmlfile/students.xml")); //对Document对象进行操作 //动态生成xml文档,并写入文件 //获取DocumentBuilderFactory实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInsatence(); //通过Factory获取DocumentBuilder解析器对象实例 DocumentBuilder db = dbf.newDocumentBuilder(); //创建一个新的Document对象 Document doc = db.newDocument(); //添加一系列的元素 Element rootElt = doc.createElement("班级"); Element studentElt1 = doc.createElement("学生"); Element studentElt1 = doc.createElement("姓名"); studentElt1_name.setTextContent("张曼玉"); studentElt1_name.setAttribute("别名","玉姐"); Element studentElt1_sex = doc.createElement("姓名"); studentElt1_sex.setTextContent("女"); studentElt1.appendChild(studentElt1_name); studentElt1.appendChild(studentElt1_sex); Element studentElt2 = doc.createElement("学生"); Element studentElt2_name = doc.createElement("姓名"); studentElt2_name.setTextContent("林青霞"); studentElt2_name.setAtribute("别名","霞妹"); Element studentElt2_sex = doc.createElement("性别"); studentElt2_sex.setTextContent("女"); studentElt1.appendChild(studentElt1_name); studentElt1.appendChild(studentElt1_sex); rootElt.appendChild(studentElt1); rootElt.appendChild(studentElt2); doc.appendChild(rootElt); //获取TransfomerFactory实例 TransformerFatory tff = TransformerFactory.newInstance(); //通过TransfomerFactory创建Transformer实例 Transformer tf = tff.newTransformer(); //通过Document生成DOMSource实例 DOMSource sourse = new DOMSource(doc); //创建写DOM文档的输出流 StreamResult xmlResult = new StreamResult(new FileOutputStream("test.xml")); //通过Transfomer的transform方法把DOMSource对象写入输出流 tf.transform(source,xmlResult); JAXP方式解析XML步骤(SAX方式) SAX解析XML步骤 SAXPerserFactory spf = ASXPerserFactory.newInstance(); ASXParser sp = spf.newSAXParser(); sp.parse("test.xml",new MyHandler() ); SAX主要用于对XML文档解析,不能去修改、删除、添加元素 SAX是推行机制,把发现的内容告诉程序员(函数),程序员可以自己下决定如何处理 MyHandler接口: DefaultHandler SAX事件: startDoucment() 发现文档的开始,解析器开始扫描文件endDocument() 发现了文档尾startElement() 发现了一个起始标签,返回元素名,以及所有属性名和值character() 发现了一些文本,将得到一个字符数组,该字符数组的偏移量和长度变量,由这三个变量可以得到解析器发现的文本endElement() 发现一个结束标签,并返回元素名称被解析的XML:
<?xml version="1.0" encoding="UTF-8"?> <学生们> <学生> <学号>04142122</学号> <姓名>张三</姓名> </学生> <学生> <学号>04142138</学号> <姓名>李四</姓名> </学生> <学生> <学号>04156700</学号> <姓名>王五</姓名> </学生> <学生 学号="04149441" 姓名="马六" /> </学生们>JAVA代码(引入dom4j-1.6.1包):
public class TestDOM4JParseXML { public static void main(String[] args) throws DocumentException { SAXReader reader = new SAXReader(); FileInputStream fis = null; try { fis = new FileInputStream("XMLDemo02.xml"); Document doc = reader.read(fis); //获取根元素 Element rootElt = doc.getRootElement(); System.out.println(rootElt.getName()); List elements = rootElt.elements(); System.out.println(elements.size()); for(int i=0 ; i<elements.size();i++){ Element elt = (Element)elements.get(i); System.out.println(elt.getName()); List attrList = elt.attributes(); for(int j=0 ; j<attrList.size() ; j++){ Attribute attr = (Attribute) attrList.get(j); System.out.println("\t属性" + attr.getName() + " = " + attr.getValue()); } List subEltList = elt.elements(); for(int j=0 ; j<subEltList.size(); ++j){ Element subElt = (Element) subEltList.get(j); System.out.println("\t子元素" + subElt.getName() + " : " + subElt.getText()); } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(fis != null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }结果:
学生们 4 学生 子元素学号 : 04142122 子元素姓名 : 张三 学生 子元素学号 : 04142138 子元素姓名 : 李四 学生 子元素学号 : 04156700 子元素姓名 : 王五 学生 属性学号 = 04149441 属性姓名 = 马六待解析xml
<?xml version="1.0" encoding="UTF-8"?> <stuents id="123"> <student> <name length="12">张三</name> </student> <student> <name length="12">李四</name> </student> </stuents>java代码:
public class TestDOM4JParseXML { public static void main(String[] args) { SAXReader reader = new SAXReader(); FileInputStream fis = null; try { fis = new FileInputStream("XMLDemo01.xml"); Document doc = reader.read(fis); Element rootElt = doc.getRootElement(); printElementDetail(rootElt,""); } catch (FileNotFoundException | DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(fis != null){ fis.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void printElementDetail(Element elt,String str){ System.out.print(str + elt.getName()); List<Attribute> attrList = elt.attributes(); int attrCount = attrList.size(); if(attrList.size() != 0){ System.out.print("["); for(int i=0 ; i<attrList.size() ; ++i){ Attribute attr = attrList.get(i); System.out.print(attr.getName()+" = "+attr.getValue()); if(i < attrCount - 1){ System.out.print(", "); } } System.out.print("]"); } String text = elt.getText().trim(); if(!"".equals(text)){ System.out.print(": "+text); } System.out.println(); List<Element> eltList = elt.elements(); for(int i=0 ;i<eltList.size() ; ++i){ Element subElt = eltList.get(i); printElementDetail(subElt,str + "\t"); } } }结果:
stuents[id = 123] student name[length = 12]: 张三 student name[length = 12]: 李四