一、XML数据解析方式:
1 DOM方式 Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。把XML文档当做一个树对待;对于增删改查非常地方便。
缺点:构造此树,必须先将整个文档加载进内存,比较费时费内存,当文件很大时有可能会造成内存溢出。
引用的包是:org.w3c.*;
2 SAX方式(推—被动式的)SimpleAPI for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
优点:读取到文档的某一部分时就进行解析。占用内存小。
缺点:只能读。不能写。
引用的包是:org.sax.*;
3 PULL方式(拉)这种方式不是官方标准。http://www.xmlpull.org。
优点与缺点与SAX基本类似,但它与SAX不同的是,它可以更主动。
引用的包是:org.xmlpull.*;
二、具体xml解析方式
1. JAXP DOM解析方式
1.1通过Document对象来操作整个文档,进行读取或添加删除等操作。要获取Document对象,必须先通过DocumentBuilderFactory的newInstance()方法,获取DocumentBuilderFactory对象factory,然后通过factory的newDocumentBuilder()方法,获取DocumentBuilder对象builder,最后通过builder.parse(“文件路径”)方法来获得一个Document对象doc。注意:是先parser文件的得到Document对象doc的。
1.2通过doc的getElementsByTagName()获得NodeList类似集合对象,然后进行进一步操作…
1.3获取元素的内容主体是: ele.getTextContent()相应的有ele.setTextContent(“内容”);
获取元素的属性值是:ele.getAttribute(“属性名”)相应的有ele.setAttribute(“属性名”,”值”)
创建元素:doc.createElement(“属性名”),然后找到相应的父节点用appendChild()加进去。
删除元素:必须拿到要删除的元素ele,通过ele.getParentNode().removeChild(ele);
1.4要存储XML,需要通过Transformer对象的transform方法,此方法接受new
DOMSource(doc)doc内存Document对象与StreamResult(“文件路径”)参数进行将内存doc存储起来,当然获取Transformer对象,需通过TransformerFactory对象的newTransformer()。而TransformerFactory对象只能通过静态方法newInstance()得到。
2. JAXP SAX解析方式
2.1通过XMLReader对象reader中注册ContentHandler对象来操作整个文档对象。而拿对reader,则必须先通过SAXParserFactory静态newStance()方法拿到factory对象后,用factory对象的newSAXParser()方法拿到SAXParser对象parser,然后通过parser的getXMLReader来获取reader。拿到reader后,通过setContentHandler(ContentHandler对象),注册一个内容处理器对象handler进去。而自定义的handler类对象中的startElement(…)、characters(…)、endElement(…)即读取文档中的内容。而后通过reader.setInput(OutputStream,StringcharsetCode)。注意:必须是先setContentHandler即先注册内容监听器,后再reader对象的parse(“xml路径”)关联XML文件。
2.2获取元素的内容:需要通过characters(…)方法,此方法中用char[]ch数组即为内容。
获取元素的属性值:在startElement(…)方法中,用Attributes对象att。通过att.getValue(“属性名”)来获取属性的值。
注意:startElement、endElement方法中都有当前属性名qName对象。
3. XmlPull解析方式
3.1要用XmlPull解析,必须要引入kxml2.jar包。然后必须通过XmlPullParser对象parser对整个文档进行操作。而获取parser对象,需要通过XmlPullParserFactory对象的newInstance()方法获得XmlPullParserFactory对象factory。再通过factory的newPullParser()方法获取XmlPullParser的parser对象。注意:必须是先setInput(InputStream,String
charset),然后再用parser的相应getEventType()及next()等方法。
3.2获取元素的内容:因为pull是拉主动的所以parser.getEventType()得到的节点只是第一个节点,不去操作int
nodeType = next()是不会移动游标到下个节点的。而本节点的元素的内容,只需要在START_TAG处时用parser.nextText()即可。因为在TEXT中,是一个文本NODE没有name,用parser.getName无法判断是不否所要的节点内容。所以一般会在START_TAG中获取元素内容。
获取元素的属性值:parser.getAttributeValue(命名空间没则null,
"属性名");
注意:可以通过parser.getEventType()与XmlPullParser.START_TAG比对是否是元素开关或与XmlPullParser.TEXT是否在文本中,但一般在文本中拿不到parser.getName所以一般会在START_TAG中,直接拿文本内容nextText()或属性值getAttribute(null,”属性名”)。
4. Dom4j解析方式
4.1要用Dom4j进行解析,也是必须先要拿到Document对象doc。而Document对象doc则要通过SAXReader
reader = new SAXReader();拿到reader对象后,通过reader.read(“xml路径”)方法返回个Document对象doc。然后根元素可以直接通过doc.getRootElement()方法拿到根元素Element对象rootE。注意:这里对整个文档操作doc对象,也是必须先进行read(文件路径)进行关联文件的。也就是四种方式只有JAXP
SAX方式是必须先setContentHandler后,再进行parse文件。
4.2获取元素的内容:可以通过ele.getText();也可以当拿到上层的parEle元素时,直接parEle.elementText(“下层元素名称”)拿到下层元素主体内容。相应的用ele.setText(“主体内容”);
获取元素的值:通过ele.attributeValue("属性名")。而设置改变与添加一个属性用addAttribute(“属性名”,”属性值”)。而JAXP
DOM中用setAttribute(“属性名”,”属性值”)来设置与添加值的。
创建元素:只要拿到要在哪个元素上加子元素,然后ele.addElement(“元素名”),然后再用返回childE进行addText(“文本内容”)或addAttribute("属性名",
“属性值”)。
删除元素:必须拿到要删除的元素ele,通过ele.getParent().remove(ele);
4.3要存储XML,需要通过XMLWriter
writer =new XMLWriter(OutputStream,OutputFormat),然后writer.write(doc),再writer.flush()最后再writer.close();这里的OutputFormat的createPrettyPrint()是阅读格式,而createCompactPrint()是机器模式。
注意:Dom4J中比较方便的是引入了XPath。主要是通过doc的List<Node>
nodes =doc.selectNodes("/元素根名/元素层1中名/元素层2中名");或者是通过doc.selectSingleNode(“//元素层1中名[2]/元素层2中名”)获取一个单独的Element。
三、JUnit单元测试 见junit入门http://blog.csdn.net/chenshufei2/article/details/7930465
四、XML的约束之Schema
1. Schema约束本身就是一个xml文件,扩展名为xsd。根结点固定为schema。
2. 由于schema本身是xml所以可以灵活的通过dom或sax进行读取,这点dtd没法比的。
3. Schema可以对命名空间进行支持。
4. Schema可以比DTD更广泛的进行数据类型限定。
根据schema约束编写XML的步骤:
1. 找到根元素 <beans></beans>
2. 在根元素上加命名空间xmlns:xxx及命令空间是根据哪里的xsd来的schemaLocation。
xmlns="http://www.springframework.org/schema/beans"如
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:aop=”http://www.springframework.org/schema/aop”
schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
3. 而schemaLoatation在是哪里命名要指定:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xis=”http://www.w3.org/2001/XMLSchema-instance” xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">