Java眼中的XML

作者: joshul | 来源:发表于2017-03-17 16:08 被阅读0次

    表现:以.xml为文件扩展名的文件
    存储:树形结构

    每个节点需要一个开始标签<标签名>和结束标签</标签名>。

    节点名称区分大小写。

    节点的属性
    1、可以写在节点名称标签开始的后半部分<标签名 属性="属性值">。
    2、可以作为节点的值写在两个标签中间。<标签名>节点值</标签名>。(节点值不用双引号)

    可以不断拓展子节点来描述父节点包含的内容。

    xml在写正文前,要加一个声明:<?xml version="1.0" encoding="UTF-8"?>声明版本与编码。

    xml用于存储集成信息,能用相同的xml文件将不同的东西联系起来。

    Paste_Image.png
    获取xml文件内容的
    四种解析方式:DOM SAX DOM4J JDOM
    DOM、SAX :java 官方方式,不需要下载jar包
    DOM4J、JDOM :第三方,需要网上下载jar包
    
    DOM使用步骤:
    准备工作
    1、创建一个DocumentBuilderFactory的对象
    DocumentBuilderFactory dbf = DocumnetBuilderFactory.instance();
    2、创建一个DocumentBuilder的对象
    DocumentBuilder db = dbf.newDocumentBuilder();
    3、通过DocumentBuilder对象的parse方法加载xml文件到当前项目
    Document document = db.parse("*.xml");
    
    DOM下解析xml文件节点的属性:
    org-w3c-dom
    
    一、未知节点属性的个数和属性名时:
    1、Document类的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
    (对于NodeList,得到的是具有相同标签名的节点的集合List,需要用for遍历。)
    2、NodeList类的.getLength() 可返回集合的长度。
    3、NodeList类的.item(int index) 可访问集合中下标为index的节点(index从0开始),(返回Node类型)。
    4、Node类的.getAttributes() 返回节点Node的所有属性的集合(返回NamedNodeMap类型)。
    5、NamedNodeMap类的.getLength() 可返回节点具有的属性的数目。
    6、NamedNodeMap类的.item(int index) 可获取节点下索引值为index的属性,返回Node类型。
    7、NamedNodeMap类的.getNodeName()可返回该属性的名称,通过.getNodeValue()返回属性值。
    
    二、已知节点的属性只有一个,且属性名已知
    1、Document类的.getElementsByTagName(标签名)方法,可通过标签名返回节点的集合(返回NodeList类型)
    2、NodeList类的.getLength() 可返回集合的长度。
    3、NodeList类的.item(int index)强制类型转换为Element类型。
    4、Element类的.getAttribute(属性名) 可得到属性的值。(返回String类型)
    
    解析文件节点以及子节点的值
    1.先获取子节点,Node下有方法getChildNodes()来获取某个节点的子节点的集合,返回NodeList类型.
    NodeList childNodes=book.getChildNodes()//包含book节点所有的子节点,两个标签之间的所有内容都看成是子节点.
    2.通过childNodes的getLength()方法返回字点的个数(空格与换行字符看成为一个文本节点,标签与结束标签看成一个元素节点)
    3.通过NodeList的item(i)获取指定位置子节点的名称返回Node类型.再用Node类型的getNodeName()方法就可以获取节点名
    
    Node childnode=childNodes.item(i);
    String name=childnode.getNodeName();
    可以通过Node类的getNodeType()来区分文本类型的node以及元素类型的node,看当前Node类型是否与Node."节点类型英
    文全称"相同.
    if(childnode.getNodeType==Node.ELEMENT_NODE)
    {System.out.println(name)}
    4.不能直接通过Node的getNodeValue()来获取节点的值,因为元素节点的nodeValue的返回值为null而且标签之间的文本被看
    做是该标签的子节点.所以要用Node的getFirstChild()此时获取的子节点为文本节点,Text节点类型的nodeValue返回值为节
    点内容,再getNodeValue()。
    或者直接用Node的getTextContent()方法直接获取节点值。
    如果该Node节点还存在其他子节点并且有节点值<name><a>广州大学</a>华软学院</name>,那么用
    getFirstChild().getNodeValue()一样是null,因为获取的子节点仍然是element类型的
    如果用Node的getTextContent(),一样会把<a>元素节点当成是Content输出。 结果为广州大学华软学院.
    

    基础方法:DOM(平台无关的官方解析方式)、SAX(基于事件驱动的解析方式)
    扩展方法:JDOM、DOM4J(在基础的方法上扩展出的,只有在java中能够使用的解析方法)

    DOM:一次性将整个xml文件加载到内存中,形成DOM树
    优点:形成了树结构,直观好理解,代码更容易编写
    解析过程中树结构保留在内存中,方便修改
    缺点:当xml文件较大时,对内存消耗比较大,容易影响解析性能并造成内存溢出

    SAX:逐条语句判断解析
    优点:采用事件驱动模式,对内存消耗比较小
    适用于只需要处理xml中数据时
    缺点:不易编码
    很难同时访问同一个xml中的多处不同数据

    JDOM:仅使用具体类而不使用接口
    API大量使用了Collections类

    DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能
    DOM4J使用接口和抽象基本类方法,是一个优秀的Java XML API
    具有性能优异、灵活性好、功能强大和极端易使用的特点
    是一个开放源代码的软件

    JUnit是Java提供的一种进行单元测试的自动化工具。测试方法可以写在任意类中的任意位置。使用JUnit可以没有main()入口进行测试。
    DOM4J在灵活性和对复杂xml的支持上都要强于DOM
    DOM4J的应用范围非常的广,例如在三大框架的Hibernate中是使用DOM4J的方式解析文件的。
    DOM是w3c组织提供的一个官方解析方式,在一定程度上是有所应用的。
    当XML文件比较大的时候,会发现DOM4J比较好用
    1.JUnit:Java提供的单元测试;@Test注解;采用JUnit不需要程序入口main方法
    2.性能测试结果:几kB的xml文件;建议使用DOM4J解析
    DOM-33ms
    SAX-6ms
    JDOM-69ms
    DOM4J-45ms
    工程右键build path --Add library--JUnit单元测试 --version:JUnit4
    DOM:33,SAX:6
    JDOM:69;DOM4J:45
    DOM 有可能溢出
    多使用DOM4J

    未完待续....

    相关文章

      网友评论

        本文标题:Java眼中的XML

        本文链接:https://www.haomeiwen.com/subject/axienttx.html