Java XML 文件的 DTD 解析规则,DOM 方式解析 XML

水深无声 2022-12-02 15:13 303阅读 0赞

HTML,Hyper Text Markup Language,超级文本标记(标签)语言

  • 出现目的是服务器给浏览器发送响应信息,
  • 浏览器按照规则解析语言并进行展示

XML,eXtensible Markup Language,可扩展标记(标签)语言

  • 创建 XML 的宗旨不是为了扩展 HTML,
  • 而是为了数据的存储和传输

(1)写法

创建 .xml 文件,建议在文件的第一行添加头信息

  1. <?xml version="1.0" encoding="UTF-8" >

(2)规则

  • 结构良好,标签 <xxx></xxx> 形式
  • 结构有效,在结构良好的基础上遵循很多规则(所写标签、标签名、属性名、属性数量、标签顺序…)

    • 一个遵循结构有效的 xml 文件,需要一个文件来解释 xml 文件(类似于元注解对注解的解释作用)

(3)四种文件类型

  • .tld Tag Library Definition,标签描述
  • .dtd Document Type Difinition,文档类型描述
  • .xsd Xml Schema Definition,XML文档内容描述
  • .xml eXtensible Markup Language,存储数据的文档

XML 的 DTD 规则

自定义 DTD 规则,可以写在两个地方:

  1. 写在当前的 xml 文件中
  2. 写在外部 dtd 文件中,然后引入 xml 文件

(1)描述根标记

  • DTD 规则写在当前的 xml 文件中

    <!DOCTYPE 根标签 [规则]>

  • DTD 规则写在外部文件中

    <!DOCTYPE 根标签 SYSTEM “文件名”>

    <!DOCTYPE 根标签 PUBLIC “路径名”>

(2)描述根标记中的子标记

DTD 规则写在当前的 xml 文件中时,以下配置写在规则中

  • 类别通常是 EMPTY,意味着空

    <!ELEMENT 标签名 EMPTY >

  • 类别可以是 ANY,意味着可包含任何可解析数据的组合

    <!ELEMENT 标签名 ANY>

  • 元素内容写法: ()

    <!ELEMENT 标签名 (子标签, 其余子标签, …) >

正常情况下描述标签内部的子标签时,默认是一个;还需要在子标签后面增加对于个数的说明






























符号 个数
a* 0 ~ n 个 a 标签
a? 0 ~ 1 个 a 标签
a+ 1 ~ n 个 a 标签
a | b a 或者 b
a,b a b 都有,并且依照a标签、b标签的顺序出现
  • 标签内部有可被解析的字符数据即 PCDATA,通常用来描述标签中间的文字

    • PCDATA:Parsed Character DATA,通常用来描述标签中间的可以被解析的字符数据,其支持实体字符

    <!ELEMENT 标签名 (#PCDATA) >

  • 标签内部有不能被解析的字符数据即 CDATA

    <!ELEMENT 标签名 (#CDATA) >

(3)描述标记中的属性

  1. <!ATTLIST 标签名称 属性名称 属性类型 属性值>

属性类型 的常用描述

  • CDATA(Character DATA)不能被解析的字符数据,通常用来描述属性名
  • 还经常使用 (type1|type2|type3) 来描述

属性值 的描述

  • 默认值,比如 "xxx"
  • #REQUIRED 属性值是必需的
  • #IMPLIED 属性不是必需的
  • #FIXED value 属性值是固定的

(4)描述标记中的实体字符

  1. <!ENTITY 实体名称 "实体字符的值">
  • 实体字符,比如 是空格的实体字符
  • 所以我们并描述的实体字符,可以这么使用 &实体名称;

解析 XML

解析 XML 文件内容,本质是文件内容的读取

解析XML文件主要有两种方式:DOM、SAX

  • DOM 解析(Document Object Model)又称为树结构处理方式;解析全部文档然后形成一个树结构 节点(标签)

    • Java 底层提供支持
    • 优点是编程容易并且安全
    • 缺点是必须将整个文档全部处理完毕,即第一次加载速度较慢
  • SAX 解析(Simple Api for Xml)类似流媒体,是基于事件的模式,解析时候触发一系列事件,即当某一个标签被解析的时候激活后续的方法

    • 优点是加载快,不需要将所有文档都一次性处理完
    • 缺点是编程很麻烦并且复用性低
  • DOM 解析升级版

    • JDOM(Java-based Document Object Model),需要外部 jar 包,基于 DOM 方式升底层提性能
    • DOM4J(Document Object Model for Java),需要外部 jar 包,基于 JDOM 方式提升底层性能;最常用!

(1)DOM 方式解析 XML

与 JavaScript 的 dom 操作非常类似哦

  1. 得到 document 对象

    //1.需要一个工厂
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    //2.利用工厂创建工人
    DocumentBuilder builder = factory.newDocumentBuilder();

    //3.工人创建一个document对象(需要xml文件)
    Document document = builder.parse(new File(“xml文件路径”));

  2. 获取标签

    //方式一
    Element xxx = document.getDocumentElement(); //获取根标签

    //方式二
    Element xxx = document.getElementById(“id属性值”); //需要有dtd规则

    //方式三
    NodeList list = document.getElementsByTagName(“标签名”); //返回值是Node集合

    Element xxx = (Element) list.item(0); //get方法

    int = list.getLength(); //集合长度

    • document 也是元素,即 Element
    • 上述方法每个 Element 都有

    //获取xxx元素的所有子标签
    NodeList = xxx.getChildNodes(); //需要有dtd规则

    //获取xxx元素的第一个子标签
    Element = (Element) xxx.getFirstChild();

    //获取xxx元素的最后一个子标签
    Element = (Element) xxx.getLastChild();

  3. 获取标签中的属性

    String = xxx.getAttribute(“属性名”);

  4. 获取标签中的文本内容

    String = xxx.getTextContent();

  5. 补充:通过操作 document 还可以写入标签,

    Element newElement = document.createElement(“标签名”);

    newElement.setAttribute(“属性名”,”属性值”);

    newElement.appendChild(Element);

但开发中 XML 与注解互用用来读取配置,而传输信息更多的使用 JSON(所以基本没有需求在开发中向 xml 文件写入)

(2)JDOM 方式解析 XML

  • jdom-2.0.6.jar
  1. 得到 document 对象

    SAXBuilder builder = new SAXBuilder();

    Document document = builder.build(new File(“xml文件路径”));

  2. 获取标签

    //方式一
    Element xxx = document.getRootElement(); //获取根标签

    //方式二
    Element = xxx.getChild(“yyy”); //获取xxx标签下第一个yyy子标签

    //方式三
    List = xxx.getChildren(“yyy”); //获取xxx标签下所有yyy子标签

    //方式四
    List = xxx.getChildren(); //获取xxx标签下所有子标签

  3. 获取标签中的属性

    String = xxx.getAttributeValue(“属性名”);

  4. 获取标签中的文本内容

    String = xxx.getText();

    String = xxx.getChildText(“yyy”); //获取xxx标签的yyy子标签的文本内容

(3)DOM4J 方式解析 XML

  • dom4j-2.1.1.jar
  1. 得到 document 对象

    SAXReader reader = new SAXReader();

    Document document = reader.read(new File(“xml文件路径”));

  2. 获取标签

    //方式一
    Element xxx = document.getRootElement(); //获取根标签

    //方式二
    Element = xxx.element(“yyy”); //获取xxx标签下第一个yyy子标签

    //方式三
    List = xxx.elements(“yyy”); //获取xxx标签下所有yyy子标签

    //方式四
    List = xxx.elements(); //获取xxx标签下所有子标签

  3. 获取标签中的属性

    String = xxx.attributeValue(“属性名”);

  4. 获取标签中的文本内容

    String = xxx.getText();

    String = xxx.elementText(“yyy”); //获取xxx标签的yyy子标签的文本内容

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读