美文网首页我爱编程
Java EE -> Xml [QR]

Java EE -> Xml [QR]

作者: vpt | 来源:发表于2016-04-19 18:26 被阅读0次
    大纲:

    1. XML解析
    • 引入
    • 重点
      • DOM解析
      • SAX解析
      • DOM解析 VS SAX解析
    1. xPath技术
    • 引入
    • xPath作用
    • dom4j中使用xPath技术
    • xPath语法
    1. XML约束
    • 引入
    • DTD
      • 导入DTD的方式
      • DTD语法
    • Schema
      • 名称空间

    @XML解析

    1) 引入

    程序读取或操作xml文档,叫xml解析。

    XML解析又分为两类,DOM解析与SAX解析。

    • 基于DOM解析原理的工具:

    • JAXP (Oracle-Sun公司官方)

    • JDOM工具(非官方)

    • Dom4J工具(非官方)(最常用,性能最好)
      三大框架(默认读取xml的工具就是Dom4j)

    • .......

    • 基于SAX解析原理的工具:

    • Sax解析工具(oracle-sun公司官方)

    2) 重点

    1 DOM解析
    - 原理:

    xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

    - Dom4j解析工具
    • 读入xml文档的方法
    • 读取xml文档:
      Document doc = new SAXReader().read("xml文件");
    
    • 读取节点:
      nodeIterator(); 所有节点
    • 读取标签:
    element("名称")   指定名称的第一个子标签对象
    elementIterator("名称");  指定名称的所有子标签对象
    elements();  所有子标签对象
    
    • 读取属性:
    attributeValue(“名称”) 指定名称的属性值
    attribute("名称")   指定名称的属性对象
    getName()  属性名称
    getValue()  属性值
    atributeIterator()   所有属性对象(Iterator)
    attributes()       所有属性对象(List)
    
    • 读取文本:
    getText()  得到当前标签的文本
    elementText("子标签名称")  得到子标签的文本
    
    • 修改xml文档的方法
    1. 写出内容到xml文档
    XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
    wirter.write(Document);
    
    1. 修改xml文档的API
    • 增加:
    DocumentHelper.createDocument()  增加文档
    addElement("名称")  增加标签
    addAttribute("名称",“值”)  增加属性
    
    • 修改:
    Attribute.setValue("值")  修改属性值
    Element.addAtribute("同名的属性名","值")  修改同名的属性值
    Element.setText("内容")  修改文本内容
    
    • 删除
    Element.detach();  删除标签  
    Attribute.detach();  删除属性
    
    2 SAX解析

    SAX解析工具由Sun公司提供的,内置在jdk的org.xml.sax.*中。

    核心的API:
    • SAXParser类: 用于读取和解析xml文件对象。
    • parse(File f, DefaultHandler dh)方法: 解析xml文件
      • 参数一: File:表示 读取的xml文件。
      • 参数二: DefaultHandler: SAX事件处理程序。
    • 创建SAXParser对象
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

    • 调用parse方法
      parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
      //注:MyDefaultHandler类是DefaultHandler类的子类,由自己编写!

    • DefaultHandler

    • DefaultHandler类的API:

      • void startDocument() : 在读到文档开始时调用
      • void endDocument() :在读到文档结束时调用
      • void startElement(String uri, String localName, String qName, Attributes attributes) :读到开始标签时调用
      • void endElement(String uri, String localName, String qName) :读到结束标签时调用
      • void characters(char[] ch, int start, int length) : 读到文本内容时调用
    3 DOM解析 VS SAX解析(*面试题)
    方面 DOM解析 SAX解析
    原理 一次性加载xml文档,不适合大容量的文件读取 加载一点,读取一点,处理一点。适合大容量文件的读取
    读写 读写 只读
    方向 任意读取任何位置的数据,甚至往回读 从上往下,按顺序读取,不能往回读
    方式 面向对象的编程方法(Node、Element、Attribute), Java开发者编码比较简单 基于事件的编程方法 , java开发编码相对复杂

    @xPath技术

    )1 引入

    问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!

    )2 xPath作用

    主要是用于快速获取所需的节点对象。

    )3 Dom4j中使用xPath技术

    1. 导入xPath支持jar包 。 jaxen-1.1-beta-6.jar
    2. 使用xpath方法
    List<Node>  selectNodes("xpath表达式");   查询多个节点对象
    Node   selectSingleNode("xpath表达式");  查询一个节点对象
    

    )4 xPath语法

    符号 意义 作用
    / 绝对路径 表示从xml的根位置开始或子元素(一个层次结构)
    // 相对路径 表示不分任何层次结构的选择元素
    * 通配符 表示匹配所有元素
    [] 条件 表示选择什么条件下的元素
    @ 属性 表示选择属性节点
    and 关系 表示条件的与关系(等价于&&)
    text() 文本 表示选择文本内容

    @XML约束

    )1 引入

    • XML语法:

    规范的xml文件的基本编写规则。(由w3c组织制定的)

    • XML约束:

    规范XML文件数据内容格式的编写规则。(由开发者自行定义)

    • XML约束技术
    • DTD约束:
      语法相对简单,功能也相对简单。学习成本也低。
    • Schema约束:
      语法相对复杂,功能也相对强大。学习成本相对高!(名称空间)

    )2 DTD

    导入DTD的方式
    • 内部导入
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to      (#PCDATA)>
      <!ELEMENT from    (#PCDATA)>
      <!ELEMENT heading (#PCDATA)>
      <!ELEMENT body    (#PCDATA)>
    ]>
    
    • 外部导入
    •     本地文件系统:    
      

    <!DOCTYPE note SYSTEM "note.dtd">

    • 公共的外部导入:
      <!DOCTYPE 根元素 PUBLIC "http://gz.itcast.cn/itcast.dtd">
    DTD语法
    约束标签:

    <!ELEMENT 元素名称 类别 或 <!ELEMENT 元素名称 (元素内容)>

    • 类别:

    • 空标签: EMPTY。 表示元素一定是空元素。

    • 普通字符串: (#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)。

    • 任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)

    • (元素内容)顺序问题:
      <!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>: 按顺序出现子标签

    • 次数问题:

    标签 次数
    必须且只出现1次
    + 至少出现1次
    * 0或n次
    0 或1次
    约束属性:

    <!ATTLIST 元素名称 属性名称 属性类型 默认值>

    • 默认值:

    • #REQUIRED 属性值是必需的

    • #IMPLIED 属性不是必需的

    • #FIXED value 属性不是必须的,但属性值是固定的

    • 属性类型:

    属性类型 表示
    CDATA 表示普通字符串
    (en1|en2|..) 表示一定是任选其中的一个值
    ID 表示在一个xml文档中该属性值必须唯一,值不能以数字开头

    )3 Schema

    名称空间:

    告诉xml文档的哪个元素被哪个schema文档约束。 在一个xml文档中,不同的标签可以受到不同的schema文档的约束。

    1. 一个名称空间受到schema文档约束的情况
    2. 多个名称空间受到多个schema文档约束的情况
    3. 默认名称空间的情况
    4. 没有名称空间的情况

    By : vpt
    Ps : 此文基于黑马培训笔记,用于之后回顾知识点以markdown形式整理而成。

    相关文章

      网友评论

        本文标题:Java EE -> Xml [QR]

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