操作xml文件:DOM、SAX、JDOM、JAXB、Dom4J

前端之家收集整理的这篇文章主要介绍了操作xml文件:DOM、SAX、JDOM、JAXB、Dom4J前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1. DOM(Document Object Model)@H_403_4@@H_403_4@


方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可以扩展的基于 Node 的接口,就多态性的观点来讲,它是优秀的,但是在 Java 语言中的应用不方便,并且可读性不强。
实例:@H_403_4@

@H_403_4@

Java代码@H_403_4@
  1. import@H_403_4@javax.xml.parsers.*;@H_403_4@
  2. //XML解析器接口@H_403_4@@H_403_4@
  3. import@H_403_4@org.w3c.dom.*;@H_403_4@
  4. //XML的DOM实现@H_403_4@@H_403_4@
  5. import@H_403_4@org.apache.crimson.tree.XmlDocument;@H_403_4@
  6. //写XML文件要用到@H_403_4@@H_403_4@
  7. DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();@H_403_4@
  8. //允许名字空间@H_403_4@@H_403_4@
  9. factory.setNamespaceAware(true@H_403_4@);@H_403_4@
  10. //允许验证@H_403_4@@H_403_4@
  11. factory.setValidating(//获得DocumentBuilder的一个实例@H_403_4@@H_403_4@
  12. try@H_403_4@{@H_403_4@
  13. DocumentBuilderbuilder=factory.newDocumentBuilder();@H_403_4@
  14. }catch@H_403_4@(ParserConfigurationExceptionpce){@H_403_4@
  15. System.err.println(pce);@H_403_4@
  16. //出异常时输出异常信息,然后退出,下同@H_403_4@@H_403_4@
  17. System.exit(1@H_403_4@);@H_403_4@
  18. }@H_403_4@
  19. //解析文档,并获得一个Document实例。@H_403_4@@H_403_4@
  20. Documentdoc=builder.parse(fileURI);@H_403_4@
  21. catch@H_403_4@(DOMExceptiondom){@H_403_4@
  22. System.err.println(dom.getMessage());@H_403_4@
  23. catch@H_403_4@(IOExceptionioe){@H_403_4@
  24. System.err.println(ioe);@H_403_4@
  25. //获得根节点StuInfo@H_403_4@@H_403_4@
  26. ElementelmtStuInfo=doc.getDocumentElement();@H_403_4@
  27. //得到所有student节点@H_403_4@@H_403_4@
  28. NodeListnlStudent=elmtStuInfo.getElementsByTagNameNS(@H_403_4@
  29. strNamespace,"student"@H_403_4@);@H_403_4@
  30. for@H_403_4@(……){@H_403_4@
  31. //当前student节点元素@H_403_4@@H_403_4@
  32. ElementelmtStudent=(Element)nlStudent.item(i);@H_403_4@
  33. NodeListnlCurrent=elmtStudent.getElementsByTagNameNS(@H_403_4@
  34. "name"@H_403_4@);@H_403_4@
  35. }@H_403_4@

对于读取得方法其实是很简单的,写入xml文件也是一样不复杂。@H_403_4@

@H_403_4@

2.SAX (Simple API for XML)

此方法主要由XML-DEV 邮件列表的成员开发的,SAX是基于事件的方法,它很类似于标签库的处理机制,在标签开始、结束以及错误发生等等地方调用相应的接口实现方法,不是全部文 档都读入内存。 SAX具有优异的性能和利用更少的存储空间特点。SAX 的设计只考虑了功能的强大性,却没有考虑程序员使用起来是否方便。

使用必须扩展ContentHandler、ErrorHandler、DTDHandler等,但是必须扩展ContentHandler(或者DefaultHandler )。

importorg.xml.sax.*;

  • publicclassMyContentHandlerimplementsContentHandler{
  • ……
  • /**
  • *当其他某一个调用事件发生时,先调用此方法来在文档中定位。
  • *@paramlocator
  • */
  • voidsetDocumentLocator(Locatorlocator){
  • *在解析整个文档开始时调用
  • *@throwsSAXException
  • voidstartDocument()throwsSAXException{
  • System.out.println("**Studentinformationstart**");
  • *在解析整个文档结束时调用
  • voidendDocument() System.out.println("****Studentinformationend****");
  • *在解析名字空间开始时调用
  • *@paramprefix
  • *@paramuri
  • voidstartPrefixMapping(Stringprefix
  • ,Stringuri)*在解析名字空间结束时调用
  • voidendPrefixMapping(Stringprefix)*在解析元素开始时调用
  • *@paramnamespaceURI
  • *@paramlocalName
  • *@paramqName
  • *@paramatts
  • voidstartElement(StringnamespaceURI,StringlocalName
  • /**在解析元素结束时调用
  • *@paramlocalName本地名,如student
  • *@paramqName原始名,如LIT:student
  • *@throwsSAXException*/
  • voidendElement(StringnamespaceURI,StringlocalName,StringqName)if(localName.equals(“student”)){
  • System.out.println(localName+":"+currentData);
  • 取得元素数据的方法——characters

    取得元素数据中的空白的方法——ignorableWhitespace
    在解析到处理指令时调用的方法——processingInstruction
    当未验证解析器忽略实体时调用的方法——skippedEntity
    运行时,只需要使用下列代码:

      MySAXParsermySAXParser=new@H_403_4@MySAXParser();@H_403_4@
    1. mySAXParser.parserXMLFile("SutInfo.xml"@H_403_4@);@H_403_4@
  • @H_403_4@3.JDOM@H_403_4@

    JDOM的处理方式有些类似于DOM,但它主要是用SAX实现的 。JDOM用Java的数据类型来定义操作数据树的各个节点 。JDOM的性能也很优越。@H_403_4@

    Java代码@H_403_4@

      import@H_403_4@org.jdom.*;@H_403_4@
    1. import@H_403_4@org.jdom.input.*;@H_403_4@
    2. import@H_403_4@org.jdom.output.*;@H_403_4@
    3. SAXBuilderbuilder=new@H_403_4@SAXBuilder(false@H_403_4@);@H_403_4@
    4. //得到Document@H_403_4@@H_403_4@
    5. Documentdoc=builder.build(fileURI);@H_403_4@
    6. //名字空间@H_403_4@@H_403_4@
    7. Namespacens=Namespace.getNamespace("LIT"@H_403_4@,"http://www.lit.edu.cn/student/"@H_403_4@);@H_403_4@
    8. //取得所有LIT:student节点的集合@H_403_4@@H_403_4@
    9. ListlstStudents=elmtStuInfo.getChildren("student"@H_403_4@,ns);@H_403_4@
    10. for@H_403_4@(…){@H_403_4@
    11. ElementelmtStudent=(Element)lstStudents.get(i);@H_403_4@
    12. elmtStudent.getChildTextTrim("name"@H_403_4@,0); padding:0px; margin:0px; width:auto; border:0px">//修改@H_403_4@@H_403_4@
    13. elmtLesson.getChild("lessonscore"@H_403_4@,ns).setText("100"@H_403_4@);@H_403_4@
    14. //删除@H_403_4@@H_403_4@
    15. elmtStuInfo.removeChild("master"@H_403_4@,0); padding:0px; margin:0px; width:auto; border:0px">//添加@H_403_4@@H_403_4@
    16. elmtStuInfo.addContent(new@H_403_4@Element("master"@H_403_4@,ns).addContent(new@H_403_4@Entity("masterName"@H_403_4@)));@H_403_4@
    17. //输出文档@H_403_4@@H_403_4@
    18. //第一个参数是缩进字符串,这里是4个空格。@H_403_4@@H_403_4@
    19. //第二个参数是true,表示需要换行。@H_403_4@@H_403_4@
    20. XMLOutputterprintDoc=new@H_403_4@XMLOutputter(""@H_403_4@, printDoc.output(doc,85); font-weight:bold">new@H_403_4@FileOutputStream("StuInfo.xml"@H_403_4@));@H_403_4@

    4.JAXB (Java And XML Binding)@H_403_4@@H_403_4@

    @H_403_4@

    JAXB 是以SUN为主的一些公司公布的。JAXB将schema(或者DTD)映射为java对象(.java文件),然后使用这些java对象来解析xml文件。需要使用之前生成java文件,因而要有固定的schema,无法处理动态的xml文件。@H_403_4@

    首先使用xjc命令,生成java文件
    xjc [-options ...]@H_403_4@

    (生成文件较多)@H_403_4@

    @H_403_4@
      JAXBContextjc=JAXBContext.newInstance(“packageName");@H_403_4@
    1. Unmarshallerunmarshaller=jc.createUnmarshaller();@H_403_4@
    2. Collectioncollection=(Collection)unmarshaller.unmarshal(new@H_403_4@File("books.xml"@H_403_4@));@H_403_4@
    3. CollectionType.BooksTypebooksType=collection.getBooks();@H_403_4@
    4. ListbookList=booksType.getBook();@H_403_4@
    5. for@H_403_4@(…){@H_403_4@
    6. test.jaxb.BookTypebook=(test.jaxb.BookType)bookList.get(i);@H_403_4@
    7. System.out.println("BookName:"@H_403_4@+book.getName().trim());@H_403_4@
    8. System.out.println("BookISBN:"@H_403_4@+book.getISBN());@H_403_4@
    9. }@H_403_4@

    补充另一种方法:(支持XPATH引擎)@H_403_4@@H_403_4@@H_403_4@

    据悉dom4j在xml解析方面是性能最好的,hibernate等框架都使用它作为解析的工具。@H_403_4@

    要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在http://www.dom4j.org/@H_403_4@

    目前最新dom4j包下载地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip@H_403_4@

    解开后有两个包,仅操作XML文档的话把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的话还需要加入包jaxen-1.1-beta-7.jar@H_403_4@


    @H_403_4@

    转自:http://www.iteye.com/topic/668280@H_403_4@

    http://www.iteye.com/topic/612837

    猜你在找的XML相关文章