加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:09:36 所属栏目:百科 来源:网络整理
导读:1. DOM(Document Object Model) 此 方法主要由W3C提供,它将xml文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点 。 因此非常消耗系统性能 ,对比较大的文档不适宜采用DOM方法来解析。 DOM API 直接沿袭了 XML 规范。每个结点都可

1. DOM(Document Object Model)


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

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

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

J ava代码 DocumentBuilderbuilder=null;
  • builder=factory.newDocumentBuilder();
  • Documentdoc= doc=builder.newDocument();
  • //下面是建立XML文档内容的过程,
  • //先建立根元素"学生花名册"
  • Elementroot=doc.createElement("学生花名册");
  • //根元素添加上文档
  • doc.appendChild(root);
  • //建立"学生"元素,添加到根元素
  • Elementstudent=doc.createElement("学生");
  • student.setAttribute("性别",studentBean.getSex());
  • root.appendChild(student);
  • //建立"姓名"元素,添加到学生下面,下同
  • Elementname=doc.createElement("姓名");
  • student.appendChild(name);
  • TexttName=doc.createTextNode(studentBean.getName());
  • name.appendChild(tName);
  • Elementage=doc.createElement("年龄");
  • student.appendChild(age);
  • TexttAge=doc.createTextNode(String.valueOf(studentBean.getAge()));
  • age.appendChild(tAge);
  • 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
    运行时,只需要使用下列代码:

    Java代码
      MySAXParsermySAXParser=newMySAXParser();
    1. mySAXParser.parserXMLFile("SutInfo.xml");
  • 3.JDOM

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

    Java代码

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

    4.JAXB (Java And XML Binding)

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

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

    (生成的文件较多)

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

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

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

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

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

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


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

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

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读