现在的位置: 首页 > 综合 > 正文

xml之数据解析及schema解析

2013年03月19日 ⁄ 综合 ⁄ 共 4830字 ⁄ 字号 评论关闭

一、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对象,必须先通过DocumentBuilderFactorynewInstance()方法,获取DocumentBuilderFactory对象factory,然后通过factorynewDocumentBuilder()方法,获取DocumentBuilder对象builder,最后通过builder.parse(“文件路径”)方法来获得一个Document对象doc注意:是先parser文件的得到Document对象doc的。

1.2通过docgetElementsByTagName()获得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,然后通过parsergetXMLReader来获取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(“属性名”)来获取属性的值。

        注意:startElementendElement方法中都有当前属性名qName对象。

3.      XmlPull解析方式

3.1要用XmlPull解析,必须要引入kxml2.jar包。然后必须通过XmlPullParser对象parser对整个文档进行操作。而获取parser对象,需要通过XmlPullParserFactory对象的newInstance()方法获得XmlPullParserFactory对象factory。再通过factorynewPullParser()方法获取XmlPullParserparser对象。注意:必须是先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();这里的OutputFormatcreatePrettyPrint()是阅读格式,而createCompactPrint()是机器模式。

注意:Dom4J中比较方便的是引入了XPath。主要是通过docList<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所以可以灵活的通过domsax进行读取,这点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">

 

抱歉!评论已关闭.