xml学习总结

XML格式和解析


xml简介

  • 概念:可扩展标记语言(EXtensible Markup Language),标准通用标记语言的子集,简称XML

  • 特点:

    1. 是一种很像HTML的标记语言。

    2. 设计宗旨是传输数据,而不是显示数据。

    3. XML标签没有被预定义,根据自己的需要自行定义标签。

  • 用途:

    1. 用来传输和存储数据

    2. 用来作为配置文件

  • xml的简单文档结构

      <?xml version="1.0" encoding="UTF-8"?>
      <books>
      	<book id="1" name="book1">
      		<name>围城</name>
      		<author>钱钟书</author>
      		<price>66</price>
      	</book>
      	<book id="2" name="book2">
      		<name>老人与海</name>
      		<author>海明威</author>
      		<price>88</price>
      	</book>
      </books>
    
    • <?xml version="1.0" encoding="UTF-8"?>:是xml文档的说明,标识了版本和编码格式,必须放在文档的第一行
    • < books >,< book >, < name >,< author >,< price >:自定义的标签,根据自己需要去创建使用

    • id, name:自定义的标签属性,根据需要添加即可,属性的值必须使用双引号引起


xml语法规则

  • xML 标签对大小写敏感

  • xML 文档必须有根元素

  • xML 属性值必须加引号

  • xml 预定义的实体引用(由于xml文档使用了一些符号作为文档识别,故使用这些符号时需要使用其预定义的实体引用)

      &lt;		----->	代表<符号
      &gt;		----->	代表>符号
      &amp;		----->	代表&符号
      &apos;	----->	代表'符号
      &quot;	----->	代表"符号
    
  • xml的注释:与html的注释语法一致

      <!-- 注释内容 -->
    

xml元素

  • 概念:指的是从(且包括)开始标签直到(且包括)结束标签的部分。

  • 元素内容的可能组成(参照html):

    • 其他元素
    • 文本
    • 属性
  • xml 元素的命名规则:

    • 名称可以包含字母、数字以及其他的字符
    • 名称不能以数字或者标点符号开始
    • 名称不能以字母 xml(或者 XML、Xml 等等)开始
    • 名称不能包含空格

    注:尽量不要使用 : 冒号可以用于作为命名空间的引用,故尽量不用


xml属性

  • 简介:类似html的属性一样

  • 定义:使用DTD的方式进行xml标签元素的属性进行定义(下面介绍)

  • 使用:与html的使用一样


DTD简介

  • 概念:全称为Document Type Definition,中文翻译为文档类型定义,是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。简而言之,就是定义xml语法的限定规则,符合的定义的标签才会发挥作用

  • 声明方式:

    • 内部声明:

      1. 声明位置:xml文档声明的下面

      2. 声明格式:

         <!DOCTYPE root-element [element-declarations]>
        
        • root-element:根标签元素名

        • element-declarations:标签元素的声明描述,其格式如下

          • <!ELEMENT element (element-content)>
      3. 使用实例:

         <?xml version="1.0" encoding="UTF-8"?>
         <!DOCTYPE books [
         <!ELEMENT books (book*)>
         <!ELEMENT book (name,author,price)>
         <!ELEMENT name (#PCDATA)>
         <!ELEMENT author (#PCDATA)>
         <!ELEMENT price (#PCDATA)>
         ]>
         <books>
         	<book>
         		<name>围城</name>
         		<author>钱钟书</author>
         		<price>66</price>
         	</book>
         	<book>
         		<name>老人与海</name>
         		<author>海明威</author>
         		<price>88</price>
         	</book>
         </books>
        
        • <!ELEMENT books (book*)>:对根标签的声明,(book *)表示根标签可以包含book标签任意次
        • <!ELEMENT book (name,author,price)>:对book标签的声明,(name,author,price)表示必须该标签必须按顺序包含name,author,price标签
        • <!ELEMENT name (#PCDATA)>:对name标签的声明,(#PCDATA)表示标签内的文本为可展开、解析的文本(可展开、解析表示能识别内部的嵌套标签,实体(后面介绍))
        • <!ELEMENT author (#PCDATA)>:对author标签的声明
        • <!ELEMENT price (#PCDATA)>:对price标签的声明
    • 外部声明

      1. 声明位置:外部创建的.dtd文件

      2. 声明格式:直接使用以下的格式声明每个标签元素即可(后面详细介绍)

         <!ELEMENT element (element-content)>
        
        • element:标签名

        • element-content:标签内容的组成

      3. 引用声明文档的方式:在xml的文档声明下使用以下格式引入即可

         <!DOCTYPE root-element SYSTEM "filename">
        
        • root-element:根标签元素名

        • filename:dtd文件所在的文件路径

      4. 使用实例:

        note.dtd文件

         <!ELEMENT books (book*)>
         <!ELEMENT book (name,author,price)>
         <!ELEMENT name (#PCDATA)>
         <!ELEMENT author (#PCDATA)>
         <!ELEMENT price (#PCDATA)>
        

        note.xml文件

         <?xml version="1.0" encoding="UTF-8"?>
         <!DOCTYPE books SYSTEM "note.dtd">
         <books>
         	<book>
         		<name>围城</name>
         		<author>钱钟书</author>
         		<price>66</price>
         	</book>
         	<book>
         		<name>老人与海</name>
         		<author>海明威</author>
         		<price>88</price>
         	</book>
         </books>
        

        注:两个文件在同一个目录下

  • 元素声明:

    • 语法:

        <!ELEMENT element-name category>或<!ELEMENT element-name (element-content)>
      
      • element-name:元素标签名
      • category:元素的种类
      • element-content:元素的内容
    • 声明一个空标签

        <!ELEMENT element-name EMPTY>
      
      • 实例:

          <!ELEMENT br EMPTY>
        
    • 声明一个可以包含任何内容的标签:

        <!ELEMENT element-name ANY>
      
      • 实例:

          <!ELEMENT div ANY>
        
    • 声明一个带有子元素(顺序严格)的标签:

        <!ELEMENT element-name (child1,child2,...)>
      
      • child1,child2,…:指子标签的名字

      • 几个限定符:

        • *:出现任意次,在子元素的后面使用
        • +:至少出现一次,在子元素的后面使用
        • ?:出现0次或一次,在子元素的后面使用
        • |:两个子元素中任意一个出现,在两个子元素中使用
      • 实例:

          <!ELEMENT book (name,author,price?)>
          <!ELEMENT books (book*)>
          <!ELEMENT fruit (name,price,address+)>
        
    • 声明PCDATA的元素(可展开、解析元素)

        <!ELEMENT element-name (#PCDATA)>
      
      • 实例:

          <!ELEMENT name (#PCDATA)>
        
  • 属性声明:

    • 语法:

        <!ATTLIST element-name attribute-name attribute-type attribute-value>
      
      • element-name:属性作用的标签元素

      • attribute-name:属性名

      • attribute-type:属性类型

        • 常用的属性类型:
          1. CDATA 值为字符数据 (character data)
          2. ID 值为唯一的 id
          3. IDREF 值为另外一个元素的 id
          4. ENTITY 值是一个实体
      • attribute-value:属性值

        • 常用的取值:
          1. 值:属性的默认值
          2. #REQUIRED:属性值是必需的
          3. #IMPLIED:属性不是必需的
          4. #FIXED value:属性值是固定的value
    • 实例:

        <!ATTLIST book id ID "#REQUIRED">	<!-- 为book元素定义一个id属性,类型为唯一的ID,必须给值 -->
        <!ATTLIST book class CDATA "book">	<!-- 为book元素定义一个class属性,类型为字符数据,默认值为book -->
      
  • 实体:

    • 简介:实体即对xml中的关键字进行定义,避免与xml中的被占用的符号冲突。比如<>,被作为标签的界限,在文本中想使用就需要使用其实体进行引用

    • 定义语法:

        <!ENTITY entity-name "entity-value">
      
      • entity-name:实体名
      • entity-value:实体的值
    • 使用语法:

        &entity-name;
      
    • 实例:

        <!ENTITY lt "<">	<!-- 使用lt替代< -->
      

xml文档的解析:

  • dom4j中主要的两个类及常用的方法:

    1. Element类:

      • 简介:对应xml中的一个标签元素
      • 常用方法:
        • List elements():获取标签元素中的子元素
        • Iterator elementIterator():获取标签元素中的子元素迭代器
        • List attributes():获取标签元素中的属性
        • Iterator attributeIterator():获取标签元素中的属性迭代器
        • String getName():获取标签名
        • String getText():获取标签元素中的文本信息
    2. Attribute类

      • 简介:对应xml中标签元素的属性
      • 常用方法:
        • String getValue():获取属性值
        • String getName():获取属性名
  • 步骤及其使用的方法:

    1. 导入dom4j的jar包

    2. 定义读取xml文件的对象

       SAXReader reader = new SAXReader();
      
    3. 通过SAXReader对象获取xml文档对象(类似于html的dom树)

       Document document = reader.read(filename);
      
    4. 通过Document对象获取根标签

       Element root = document.getRootElement();
      
    5. 通过Element对象获取根标签的子标签元素:

       Iterator<Element> it = root.elementIterator();
      
    6. 通过Element对象获取标签的属性及属性值:

       Iterator<Attribute> it = root.attributeIterator();
      
    7. 通过Element对象获取标签的内容:

       String text = element.getText();
      

    注:6、7可根据需要组合

  • xml文件的解析例子:

    1. note.dtd文件

       <!ELEMENT books (book*)>
       <!ELEMENT book (name,author,price)>
       <!ELEMENT name (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT price (#PCDATA)>
       <!ATTLIST book id ID "#REQUIRED">
       <!ATTLIST book class CDATA "book">
      
    2. note.xml文件

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE books SYSTEM "note.dtd">
       <books>
       	<book id="a">
       		<name>围城</name>
       		<author>钱钟书</author>
       		<price>66</price>
       	</book >
       	<book id="b">
       		<name>老人与海</name>
       		<author>海明威</author>
       		<price>88</price>
       	</book>
       </books>
      
    3. XMLParse.java文件

       package cn.zero;
      
       import java.util.Iterator;
       import java.util.List;
       import org.dom4j.Attribute;
       import org.dom4j.Document;
       import org.dom4j.Element;
       import org.dom4j.io.SAXReader;
       
       public class XMLParse {
       
       	public static void main(String[] args) throws Exception {
       		
       		//定义SAXReader对象,用于读取xml文件
       		SAXReader reader = new SAXReader();
       		
       		//获取xml文件,并得到xml的文档对象
               Document document = reader.read("src/note1.xml");
               
               //获取根标签元素
               Element root = document.getRootElement();
               
               //获取根标签元素的子标签迭代器,并遍历
               for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
                   Element element = it.next();	//遍历,得到一个元素
                   
                   //获取子标签的属性迭代器
                   Iterator<Attribute> attribute = element.attributeIterator();
                   //遍历子标签的属性
                   while(attribute.hasNext()) {
                   	Attribute atb = attribute.next();
                
                   	//输出子标签的属性和属性值
                   	System.out.println(atb.getName() + " : " + atb.getValue());
                   }
                   
                   //获取子标签的子标签
                   List<Element> elements = element.elements();
                   //遍历子标签的子标签
                   for(int i = 0; i < elements.size(); i++) {
                   	
                   	//输出子标签的子标签的标签名和标签内的文本
                   	System.out.println(elements.get(i).getName()+" : "+ elements.get(i).getText());
                   }
               }
               
               for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
                   Attribute attribute = it.next();
                   // do something
               }
       
       	}
       
       }
      

2020/4/1 18:46:53 水平有限,有不对的地方望指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值