xml学习小结



任何安装的软件,都不要使用中文路径和带空格等特殊字符的路径。

最好专门用一个盘来存储工作上的内容。

用一个专门的文件夹来存储和管理安装的软件。

对数组进行最大最小值判断时,初始值最好使用数组中的值。

XML 英文全称为ExtensibleMarkup Language

  • XML语言中,它允许用户自定义标签。每一个标签用于描述一段数据;

  • 一个标签可以分为开始标签和结束标签,在开始标签和结束标签之间又可以嵌套其它标签,利用标签间的嵌套关系来保存数据之间的上下级关系;

  • 由于xml实质上是一段字符串,计算机可以十分方便的对他进行操作,开发人员也可以方便的阅读,因此可以说这是一种对人、对计算机都友好的数据存储格式,所以XML迅速普及,成为了一种非常常见的数据存储格式,在许多应用场景中得到应用。

    XML:用来存储和传递数据的。

    XML本质上是一种数据存储格式。

    XML中,所有标签都必须是闭合的。

    XML中标签可以嵌套出现,但是不允许交叉出现。

    XML本质上是一段字符串,具有跨平台性。因此XML经常用来在不同系统之间进行传递数据。XML也会被用作一些应用程序的配置文件。

    XML中的数据,具有层次性。

    在一些特殊情况下xml也可以用作数据库的替代工具来使用。

  • XML是一种存储数据的格式,我们可以将遵照这种数据格式写出来的XML数据保存到一个文件中去,并将文件的后缀名设定为.xml,那么这样的保存了XML数据的文件就叫做xml文件。

  • xml文件是保存XML数据的一种方式,XML数据也可以以其他的方式存在(如在内存中构建XML数据),不要将XML语言狭隘的理解成xml文件。

    浏览器中一般都内置了xml解析器。可以用浏览器直接打开xml文件来对xml文件进行校验。

    xml的语法:

  • 一个XML文件分为如下几部分内容:

    • 文档声明

    • 元素

    • 属性

    • 注释

    • CDATA、特殊字符

    • 处理指令(processinginstruction

  • XML的文档声明是用来声明文档基本属性的,XML解析器将根据文档声明决定如何正确解析一个XML

    • 通常来说一个XML必须包含且只包含一个文档声明

    • 文档声明必须处在XML的第一行,前面不能有其他内容

    • 如果一个XML不包含文档声明则称这样的XML为格式不良好的XML

    • 在许多时候即使不包含文档声明,XML也可以被正常使用,但是这是不符合标准的,存在风险,因此强烈推荐大家在书写XML时写上文档声明。

  • 最简单写法:

    • <?xml version="1.0" ?>

    • version 代表当前xml所遵循的xml标准。

    • 在第二个问号之前应该有一个空格

    • 注意:问号、引号、空格都必须为英文半角

  • encoding属性说明文档的字符编码:

    • <?xml version="1.0" encoding="GB2312" ?>

    • encoding告知解析器使用何种编码解析当前xml

    • encoding默认值为ISO8859-1

  • standalone属性说明文档是否独立:

    • <?xml version="1.0" encoding="GB2312" standalone="yes" ?>

    • standalone表示当前xml文档是否是一个独立文档,当为yes时表示是一个独立文档,当为no时表示当前文档需要其他文档支持。

      xml元素

  • 一个XML标签就是一个XML元素。

  • 一个XML标签分为开始标签和结束标签,在开始标签和结束标签之间的文本被称为标签体。

    • 包含标签体:<a>www.baidu.cn</a>

  • 如果一个不包含标签体也不包含其他元素,那么可以将开始标签和结束标签合并,这样的标签称为自闭标签

    • 不含标签体及其他元素:<a></a>可以简写为自闭标签:<a/>

      一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套

  • 格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。

    对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。

  • 由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

  • 一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

    • 区分大小写,例如,<P><p>是两个不同的标记。

    • 不能以数字或标点符号或"_"开头。

    • 不能以xml(XML、或Xml )开头。

    • 不能包含空格。

    • 名称中间不能包含冒号(:)。

  • 一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

    <chinacapital="beijing"/>

  • 属性值一定要用双引号(")或单引号(')引起来

    <chinacapital='beijing'/>

  • 定义属性名必须遵循与元素相同的命名规范

    Xml文件中的注释采用:<!--注释-->格式。

  • 注释不能出现在文档声明之前(因为XML要求文档声明必须在第一行,之前不能有其他内容)

    实验:

    分别使用iechrome测试文档声明前出现注释的情况

  • 注释不能嵌套,例如:

    <!--大段注释

    ……

    <!--局部注释-->

    -->

    CDATA

  • XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住

  • 当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析

  • 语法:<![CDATA[内容 ]]>

  • 场景一:在输入框中输入的用户名,密码,使用XML保存传递到后台。

    Xml文档申明之前不能有任何内容

    注释不能写在标签之间

    只用来展示内容的少部分特殊字符用转意字符

    大量的转意字符的使用,用CDATA区域

    转义字符

    处理指令:

  • 处理指令,简称PI processinginstruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

  • 例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。 <?xml-stylesheet type="text/css"href="1.css"?>

  • 处理指令必须以“<?”作为开头,以“?>”作为结尾,

  • XML文档声明语句就是最常见的一种处理指令。

    Xml约束

  • 什么是XML约束?

    • xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束。

  • XML约束的作用

    • 约束xml文档的写法

    • xml进行校验

  • 常见的XML约束技术

    XML DTD

    XML Schema

    DTD(Document Type Definition),全称为文档类型定义。

    在解析xml的时候,一般都需要去除表情内容中的字符串内容前后的空格

    默认情况下,ie浏览器的xml校验是关闭的,必须通过Javascrip脚本开启xml校验

    varxmldom = new ActiveXObject(“Microsft.XMLDOM”)

    xmldom.validateOnParse = “true”;

    xmldom.load(文件);//加载要校验的文件

    var msg = xmldom.parseError.reason;

    var line = xmldom.parseError.line;

    document.write(“错误所在行”+line);

    document.write(“<br/>”);

    document.write(“错误信息”+msg);

    引入DTD约束的两种方式

  • DTD的约束可以定义在XML文件内部,如果DTD被定义在了XML内部则XML文档声明中standalone="yes"

  • DTD的约束也可以定义在一个独立的后缀为.dtd的文件中再由xml文件引入,此时引入此dtdxml文档声明中standalone="no"

  • 注意.dtd文件应使用UTF-8Unicode编码

    XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:

    • 当引用的文件在本地时,采用如下方式:

      <!DOCTYPE文档根结点 SYSTEM "DTD文件的URL">

      例如:<!DOCTYPE书架 SYSTEM “book.dtd”>

    • 当引用的文件是一个公共的文件时,采用如下方式:

      <!DOCTYPE文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

      例如:<!DOCTYPEweb-app PUBLIC

      "-//SunMicrosystems,Inc.//DTD Web Application 2.3//EN"

      "http://java.sun.com/dtd/web-app_2_3.dtd">

      xml文件的学习重点,CRUD

      主流的xml解析方式:DOM方式和SAX解析方式。

      DOM解析方式:把整个xml文档读入到内存中,每一个内容都创建一个对象来与之对应。

      Dom解析过程中,会创建一个document对象来代表整个文档。xml文档的根标签会挂载在document对象之下,其他标签挂载在根标签下。

      整个xml文档在dom解析过程中会形成一个倒立的文档树。

      dom解析过程中标签的每个属性,都会被解析成一个对象。

      dom解析过程中,一个节点可以任意访问其他节点的。

      dom解析的缺点:占用内存比较大 第一次解析时比较耗费时间

      dom解析的优点:方便的对节点进行增删改查操作。只需解析一次,可以多次获取数据。

      Dom解析是一种思想

      document对应于 ----Document

      根标签对应于 ---Element

      标签体内容对应于 ---CharacterData

      表情属性对应于 ---Attributed Attr

      XML中所有的节点都是Node的子类或者子接口。

      dom解析过程中所有的xml节点都可以进行增删改查的操作

      SAX解析方式:

      SAX解析主要包括解析器和事件处理器。

      解析器负责逐行扫描xml文档,每发现一个内容,都会去调用文档解析开始的方法。

      发现标签体时,调用发现标签的方法。

      发现结束标签时,调用结束标签的处理方法

      最后调用文档解析结束的方法。

      事件处理器负责处理对应的事情。

      属性会被当作开始标签的参数传入到开始标签处理方法中。

      优点:占用内存少,解析速度快

      缺点:每次都要重新解析。只能进行查找数据的操作,不能进行增删操作。

      可以通过对象来存储解析内容。

      SAX解析xml的案例

      import java.io.IOException;

      import javax.xml.parsers.ParserConfigurationException;

      import javax.xml.parsers.SAXParser;

      import javax.xml.parsers.SAXParserFactory;

      import org.xml.sax.Attributes;

      import org.xml.sax.SAXException;

      import org.xml.sax.XMLReader;

      import org.xml.sax.helpers.DefaultHandler;

      public class SaxDemo {

      static void main(String[] args) throws ParserConfigurationException,SAXException,IOException {

      // TODO Auto-generatedmethod stub

      //创建解析器工厂

      SAXParserFactory saxFactory = SAXParserFactory.newInstance();

      获取解析器对象

      SAXParser parse =saxFactory.newSAXParser();

      获取xml读取器

      XMLReader xmlReader =parse.getXMLReader();

      设置时间处理器

      xmlReader.setContentHandler(new MyContentHandler());

      读取文件

      xmlReader.parse("book.xml");

      }

      }

      class MyContentHandler extends DefaultHandler{

      private String elementName="";

      @Override

      void characters(char[] ch,int start,85); font-family:'Courier New'; font-size:12pt">int length)

      throws SAXException {

      Auto-generatedmethod stub

      if ("书名".equals(elementName)) {

      String str = new String(ch,start,length);

      System.out.println(str);

      }

      }

      void startElement(String uri,String localName,String qName,

      Attributes attributes) Auto-generatedmethod stub

      elementName = qName;

      }

      void endElement(String uri,String qName)

      elementName = "";

      }

      }

      JAXP解析xml

  • JAXP 开发包是J2SE的一部分,它由javax.xmlorg.w3c.dom org.xml.sax 包及其子包组成

  • javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

    调用 DocumentBuilderFactory.newInstance()方法得到创建 DOM 解析器的工厂。

    DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory.newInstance();

  • 调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

    DocumentBuilderbuilder = builderFactory.newDocumentBuilder();

  • 调用 DOM 解析器对象的 parse()方法解析 XML 文档,得到代表整个文档的Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

    Documentdoc = builder.parse(new File("book.xml"));

    案例

    import javax.xml.parsers.DocumentBuilder;

    import javax.xml.parsers.DocumentBuilderFactory;

    import javax.xml.parsers.ParserConfigurationException;

    import org.w3c.dom.Document;

    import org.w3c.dom.Element;

    import org.w3c.dom.NodeList;

    import org.xml.sax.SAXException;

    class JaxpDemo {

    创建解析器工厂

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    创建解析器

    DocumentBuilder builder = factory.newDocumentBuilder();

    设置需要解析的文档,获取文档解析对象

    Document document =builder.parse("book.xml");

    获取根节点

    //Element root = document.getDocumentElement();

    根据标签名获取元素

    NodeList booklist = document.getElementsByTagName(");

    根据脚标,获取书(元素)

    Element book = (Element) booklist.item(0);

    获取标签体

    String bookname = book.getTextContent();

    System.out.println(bookname);

    }

    DOM编程

  • DOM模型(document object model)

    • DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点),并以树的结构组织起来,存储到内存中。

    • JAXP中的文档对象:

      • Document:文档

      • Element:元素

      • Attr:属性

      • CharacterData:标签体

    • Node接口

  • Node是一个接口,代表文档树中的单个节点,其他文档类都是Node接口的实现

  • Node接口上提供了获取父节点、获取子节点的方法,由此可以遍历文档树。

  • Node接口定义了增删改查节点方法由此可以修改文档树。

    Node getFirstChild()

  • 此节点的第一个子节点。

  • Node getLastChild()

  • 此节点的最后一个节点。
    getAttributes()

  • 包含此节点的属性的NamedNodeMap(如果它是 Element);否则为 null

  • Node appendChild(NodenewChild)

    将节点 newChild 添加到此节点的子节点列表的末尾。

  • NodeList getChildNodes()

    包含此节点的所有子节点的 NodeList

    getAttributes()

    包含此节点的属性的 NamedNodeMap(如果它是 Element);否则为 null

  • Node removeChild(NodeoldChild)

    从子节点列表中移除oldChild 所指示的子节点,并将其返回。

  • Node replaceChild(NodenewChild,Node oldChild)

    将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。

  • void setTextContent(StringtextContent)

    此属性返回此节点及其后代的文本内容。

    对文档树的增删该查只是对内存中的对象进行的操作,如果希望将修改对xml文件起作用,就需要进行XML文档更新

  • javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出

    • 获取Transformer工厂

      TransformerFactorytransformerFactory = TransformerFactory.newInstance();

    • 获取Transfomer对象

      Transformertransformer =transformerFactory.newTransformer();

    • 创建代表输入和输出的SourceResult对象

      Sourcesource = new DOMSource(doc);

      Resultresult = new StreamResult(new FIle("book.xml"));

    • 使用Transformer XMLSource 转换为 Result

      transformer.transform(source,Result)

      看开源jar包之后的学习步骤:(下载开源jar包,解压后找到docs

  1. 引入核心jar

  2. 查看快速使用案例

  3. 查看快速使用案例中用到的类的作用和使用方法

  4. 自己做出一个案例来

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇