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校验

    var xmldom = 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 {

       

         public 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());

            //读取xml文件

            xmlReader.parse("book.xml");

           

         }

       

      }

       

      class MyContentHandler extends DefaultHandler{

         private String elementName="";

         @Override

         public void characters(char[] ch, int start, int length)

              throws SAXException {

            // TODO Auto-generatedmethod stub

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

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

              System.out.println(str);

            }

         }

        

         @Override

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

              Attributes attributes) throws SAXException {

            // TODO Auto-generatedmethod stub

            elementName = qName;

         }

        

         @Override

         public void endElement(String uri, String localName, String qName)

              throws SAXException {

            // TODO Auto-generatedmethod stub

            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 java.io.IOException;

     

    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;

     

    public class JaxpDemo {

     

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

          // TODO Auto-generatedmethod stub

          //创建解析器工厂

          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. 自己做出一个案例来 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值