xml

简介

  • xml是一种可扩展标记语言,全称是extensible markup language;
  • 形式非常灵活,没有固定的标签,所有标签都可以自定义
  • 通常被用于信息的记录和传递,是一个文本文件
  • xml与html的区别,xml被设计来格式化地存储和传输数据,而html被设计来表现数据,注重数据的外在形式

用途

  • 通过几行JavaScript代码就可以从xml中读取数据并将数据实时更新到html中,而不需要对html做出修改;
  • 简化数据的存储和传输,独立于软硬件,使用纯文本地形式存储数据,并且跨系统传输也能正确解析;
  • 跨平台,不论本平台升级后使用原平台数据还是在其他平台使用,数据都可以直接访问;

基本语法结构

结构

  • xml是树形结构,从树根扩展到枝叶

基本语法1

  • 文件扩展名是.xml
  • 需要有一个声明信息 <?xml version="1.0" encoding="utf-8"?>
  • 需要有且仅有一个根标签:<book>其他标签</book>(也叫做一个元素)
  • 标签都是成对出现的,只能一个嵌套一个(这与html有点不一样);
  • xml大小写敏感要注意区分(开启标签和结束标签都必须使用相同的大写或者小写);
  • 尽量有注释<!--注释内容-->

一个完整的xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--some description-->
<books>
    <book id="01">
        <name>xml教程</name>
        <author>张三</author>
        <price>50.5</price>
    </book>
    <book id="02">
        <name>HTML教程</name>
        <author>李四</author>
        <price>40.9</price>
    </book>
</books>

从上面的xml文件可以看出所有的标签都是我们为了实际需求自定义的(当使用utf-8来编码时甚至可以将标签定义为中文的),但是全部都遵从成对出现和嵌套的原则,双击文件默认使用浏览器打开。

基本语法2

  • 属性值必须加引号<note date="28/03/2020"> content </note>
  • 实体的引用:在xml中为了避免发生冲突,有一些符号只能采用引用的形式来使用
    引用 符号
    &lt <
    &gt >
    &amp &
    &apos
    &quot
  • HTML中的多个空格会被合并成一个,而在XML中空格会被全数保留
  • 换行通常会被以字符的方式存储起来,Windows中的回车存储为CR换行存储为为LF,Linux和Mac OSX中的换行存储为LF,XML中的换行也被存储为LF

XML中的元素及其命名规则

  • 元素是指从开始标签到结束标签的部分,一个元素中(也就是两个标签中)可以包含另一个元素、文本、属性等;
  • 元素名称不能以数字或者标点符号开头,不能以XML开头(大小写都不行),不能有空格

当在一个XML文件中添加新的元素时并不会影响原来元素的使用,也就是不用修改调用程序,这是XML的可扩展性。

XML元素的属性

  • 属性用来提供元素的额外信息:<img type="gif">myPicture.gif</img>这个gif的属性虽然对于数据本身没什么作用,但是对于处理数据的软件来说十分重要;
    • 注意: 属性名=属性值要成对出现
  • 属性中可以有特殊符号如&lt &gt &quot等;
  • 属性不方便扩展,一般不推荐使用,应该尽量将数据拆分为最小的元素来存储。
  • 推荐使用属性的场合:需要区分元数据的时候,可以使用ID属性来将每一个数据区分开。(例如:<books>属性中的每一本<book>可以用一个ID来标识<book id="1">

XMLHttpRequest

XMLHttpRequest对象用在后台与服务器交换数据(例如注册用户时输入首字母后系统就将推荐的昵称发送给你),它还可以:

  • 不重新加载页面的情况下刷新网页
  • 在页面加载后向服务器请求数据和接收数据
  • 在后台向服务器发送数据
  • 全面地学习这方面的知识推荐XML DOM教程

DTD

DTD可以定义合法的XML文档构建模块(也就是对输入的元素格式做出限定),它可以被成行地声明于XML文档中也可以作为一个外部引入。

DTD元素声明

  • 包含在XML源文件中地DTD的声明:<!DOCTYPE root-element [element-declarations]>,例如:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE note [
    <!ELEMENT note (to,from,heading,body)>
    <!--规定了note中必须包含的四个元素,且他们只能按顺序出现-->
    <!ELEMENT to (#PCDATA)>
    <!--#PCDATA是只会被解析的字符数据或者文本-->
    <!--与PCDATA对应的还有CDATA,他不会被解析,会被当作标记对待,其中的文本也不会被展开-->
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    ]>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend</body>
    </note>
    
  • 如果希望元素为空,用EMPTY来声明,如果希望可以包含任何可解析的数据的组合则用ANY声明。
  • 若希望某个元素至少出现一次则可以声明为<!ELEMENT element-name (childname+)>,若希望出现2次或多次则可以声明为<!ELEMENT element-name (childname*)>,若希望出现零次或一次则可以声明为<!ELEMENT element-name (childname?)>
  • 混合声明方式<!ELEMENT note (#PCDATA|to|from|header|message)*>标识note元素可以包含出现零次或多次的PCDADA、”note”,”from”,”header”或者”message”.
  • 外部的DTD文件的引入,只需在XML的声明下加一条<!DOCTYPE root-element SYSTEM "filename.dtd">即可,其中filename.dtd就是外部的dtd文件,其后缀也可以不是dtd但是文件的写格式要正确。

DTD属性声明

  • 语法为:<!ATTLIST element-name attribute-name attribute-type attribute-value>其中属性类型和属性值参考链接
  • DTD的元素和属性分别是对应XML中的元素和属性

DTD实体

  • 实体可以在内部或者外部声明,实体可以被引用
  • 内部定义:<!ENTITY entity-name "entity-valua">
  • 外部定义:<!ENTITY entity-name SYSTEM "URI/URL">

一句话:DTD就相当于一个模板, 他将XML中的元素的格式规范化。

XML的解析

  • 官方提供的DOM解析,适用于解析次数较多的情形
  • 民间的SAN解析,适用于数据量较大的情形
  • dom4j是一个Java的XML解析接口,性能极好
  • JDOM开源的,比官方的DOM解析快

XML数据的读取与xml文件的创建(基于Java)

import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public GetXML{
    public static void main(String[] args) throws Exception{
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("filefolder/filename.xml"));
        Element root = doc.getRootElement();
        root.elementTterator();
        Iterator<Element> it = root.elementIterator();
        while(it.hasNext()){//从根出发遍历子元素
            Element e = (Element) it.next();
            Attribute id = e.attribute("id");
            Element name = e.element("name");
            Element course = e.element("course");
            Element score = e.element("score");
            System.out.println(name.getName()+"="+name.getStringValue);
            System.out.println(course.getName()+"="+course.getText());
            System.out.println(score.getName()+"="+score.getText());
        }
    }
}
  • 创建xml文件:
package com.bjsxt.xml;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
public class CreatXml{
    public static void main(String[] args){
        Document doc = DocumentHelper.createDocument();
        Element root = doc.addElement("books");//添加并得到一个根元素
        Element book = root.addElement("book");
        book.addAttribute("id","01");
        //doc.addElement("books").addElement("book").addAttribute("id","01");
        Element name = book.addElement("name");
        Element author = book.addElement("author");
        Element price = book.addElement("price");
        name.addText("java Edition 01");
        author.addText("Peter");
        price.addText("48");
        //朴素的输出
        //Writer writer = new FileWriter(new File("filename.xml"));
        //doc.write(writer);
        //writer.close();
        //以XML的格式输出
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer = new XMLWriter(new FileWriter(new File("filename.xml")));
        writer.write(doc);
        writer.close();
    }
}

一些相关资源

版权声明:本文为mitoohi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mitoohi/p/12583977.html