概述
XML解析方式
DOM
Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
SAX
Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
SAX解析是基于事件驱动的XML解析方式,该方式的工作需要依赖事件处理接口,根据发生的事件的发生来针对性的采取对应操作。由于该方式产生操作不需要加载全部XML文件,所以对于超大的XML文件的解析效率较高。
XML解析开发包
JAXP:是SUN公司推出的解析标准实现。
Dom4J:是开源组织推出的一种解析开发包,较为常用。
JDom:是开源组织推出的一种解析开发包。
JAXP
概述
JAXP(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:
org.w3c.dom:提供DOM方式解析XML的标准接口。
org.xml.sax:提供SAX方式解析XML的标准接口。
javax.xml:提供了解析XML文档的类。
javax.xml.parsers:提供了对XML文档解析工厂类,通过工厂类(
DocumentBuilderFactory、
SAXParserFactory
)可以得到对XML文档进行解析的DOM和SAX解析器对象。
使用DOM方式解析XML文档
1.常用API
2. 解析XML获取文档对象
public staticvoid main(String[] args) { DocumentBuilderFactory factory =null;DocumentBuilder builder Document document try // 1. 先拿到解析器的工厂类DocumentBuilderFactory.newInstance();// 2. 拿到解析器 factorynewDocumentBuilder// 3. 解析XML,获取文档对象 builderparse("src/LocalList.xml");}catchException eprintStackTrace}}
3. 获取节点文本
getNodeText document// 1. 先拿到元素名称为city的所有节点NodeList nlist getElementsByTagName"City"// 2. 找到指定位置的节点Node n nlistitem(7// 3. 打印文本内容Systemoutprintln"Node Text is "+ ngetTextContent());}
4. 递归节点遍历
getAllNodeText// 1. 获得需要遍历的节点 node "State").0// 2. 递归调用的开始 recursion(node);}private node// 1. 只有元素节点才打印ifgetNodeType()==NodeELEMENT_NODE"Node Name is "getTextContent());// 2. 拿到当前节点的所有子节点getChildNodesfor(int i <getLength i++)in 5. 保存更改到文件
savethrows// 1. 拿到保存文件对象的工厂类TransformerFactory tfactory TransformerFactory// 2. 拿到保存文件的对象Transformer tf tfactorynewTransformer// 3. 保存文件// DOMSource 用来指定 domcument 对象 tftransformnewDOMSourcedocument),StreamResult)); 6. 修改节点文本内容
modifyNodeText// 1. 拿到street节点"street"// 2. 设置文本内容setTextContent"和平门大街"// 以上并没有真正的取保存文件,只是修改了内存中数据 7. 添加子节点
createChildNode// 1. 拿到要添加位置的父节点2// 2. 创建一个子节点,节点名字叫streetElement e createElement);// 创建了<street></street>setTextContent"前门大街"// <street>前门大街</street>// 3. 添加到列表末尾appendChilde 8. 添加兄弟节点
createNode// 1. 拿到要添加的指定位置的后一个// 2. 创建节点"崇文区"// 3. 使用父节点去在子节点之前添加新节点getParentNode().insertBefore,'Microsoft YaHei'; widows:auto"> 9. 删除节点
removeNode// 1. 获取要删除的节点// 2. 找到他的父节点,删除子节点removeChild 10. 设置节点属性
createAttribute// 1. 拿到[崇文区]这个节点// 2. 将node 转为elementnode !=null&& node instanceofElementsetAttribute"Code" "103" 11. 案例
学生信息存储体系
Student.java
package comitheimabeans;classStudentString classid studentid name sex scoreStudent{}thisclassid studentid name sex score getClassidreturn setClassid getStudentid setStudentid getName setName getSex setSex getscore setscore@Override toString"Student [classid=" classid ",studentid=" studentid name sex score=" score "]"}
JaxpUtils.java
utilsimport javaxxmlparsers.DocumentBuildertransformTransformerdomstream orgw3cDocument;// JAXP的工具类JaxpUtils// 获取document对象 getDocument"src/com/itheima/db/Students.xml"throwRuntimeException" Can not get document !"// 保存文件 saveXML));"Save XML Failed "
对学生信息XML文档的操作
StudentDao.java
daoimplNodeListJaxpUtilsStudentDAO// 添加用户boolean s// 拿到document对象getDocument// 1. 创建Student节点 studentE "Student"// 2. 添加student节点的属性 studentEsetAttribute"classid"getClassid"studentid"getStudentid// 3. 创建name节点 nameE "name"// 4. 给name节点添加文本内容 nameEsgetName// 5. 创建sex节点 sexE "sex"// 6. 给sex节点添加文本内容 sexEgetSex// 7. 创建score节点 scoreE "score"// 8. 给score添加文本内容 scoreEgetscore// 9. 逐级添加到节点上appendChildnameEsexEscoreE// 10. 拿到Students(根节点)节点"Students"// 11. 把 studentE添加到Students的节点上studentE// 12. 将添加的内容保存到xml文件中saveXMLtrue// 删除用户 remove result false// 1. 拿到所有的学生信息// 2. 遍历nlist列表// 拿到每一个节点// 判断n是不是属于元素节点,并且属于element类型ELEMENT_NODE n // 强转成element// 使用element的getAttribute方法拿到studentid sid getAttributesidequalsstudentid))// 删除当前节点,使用父节点操作removeChildbreak result// 查询成绩 getscoreByStudentid""// 拿到学生ID// 判断学生id跟传进来的参数是否一致 nl getChildNodes j nl jjgetNodeName()))使用SAX方式解析XML文档
1. 常用API
- SAX解析器工厂类:SAXParserFactory
- SAX解析器:SAXParser
- XML读取类:XMLReader
- 事件处理接口:ContentHandler
- 默认事件处理适配器类:DefaultHandler
2. 获取SAX解析并设置事件处理器
注意:必须先设置时间处理器,后设置XML文件源
// 获取SAX解析器的工厂类SAXParserFactorySAXParserFactory// 获取SAX解析器SAXParser sax newSAXParser// 获取XMLReader的读取对象XMLReader reader saxgetXMLReader// 设置事件处理器 readersetContentHandlerDemoHandler// 设置xml文件源ParserConfigurationException|SAXExceptionIOException// TODO Auto-generated catch block 3. 通过直接实现事件处理接口定义事件处理器
DemoHandler.java
xmlsaxhandlerAttributesContentHandlerLocatorSAXExceptionDemoHandlerimplementsContentHandler startDocument"文档开始" endDocument"文档结束" startElement uri localName qNameAttributes atts"元素开始:" endElement"元素结束:" characterschar ch start length"文本内容:"ch //------------以下采用空实现------------ ignorableWhitespace// TODO Auto-generated method stub processingInstruction target data skippedEntity setDocumentLocatorLocator locator startPrefixMapping prefix endPrefixMapping 4. 通过继承事件处理默认适配器定义事件处理器
DemoAdapterHandler.java
helpersDefaultHandlerDemoAdapterHandlerextendsDefaultHandler 5. 案例
元素计数及简单逻辑
count isElement ifqName count++;count 5 isElement"第5个区是:"}