zoukankan      html  css  js  c++  java
  • XML

    WEB编程中,可以通过浏览器访问WEB服务器上的资源。

    WEB服务器就是另一台计算机

    浏览器的入口不同(访问路径),访问的资源也不同。

    为了灵活实现的不同路径执行不同的资源,需要使用XML进行配置;

    为了限定XML内容,需要使用xml约束(DTDschema);

    为了获得xml的内容,需要使用dom4j进行解析。

    1 XML概述

    XML称为Extensible Markup Language,意思是可扩展的标记语言。

    XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

    使用1.0版本

    XML 被设计用来传输和存储数据。

    2 XML HTML 的差异

    XML 不是 HTML 的替代。XML 是对 HTML 的补充。

    XML HTML 为不同的目的而设计:

    XML 被设计为传输和存储数据,其焦点是数据的内容。

    HTML 被设计用来显示数据,其焦点是数据的外观。

    HTML 旨在显示信息,而 XML 旨在传输信息。

    3 XML语法

    3.1文档声明

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

    1文档声明必须为<?xml开头,以?>结束

    2文档声明必须从文档的0行0列位置开始(必须在第一行,注释也不能加)

    3文档声明只有属性:

    versioin:指定XML文档版本。必须属性,只写1.0

    Encoding:指定当前文档的编码。可选属性,默认值是utf-8

    3.2元素

    1元素是XML文档中最重要的组成部分

    2普通元素的结构由开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

    3元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>

    4)必须正确地嵌套

    5空元素:空元素只有开始标签,没有结束标签,但元素必须闭合,例如:<c/>

    6元素命名:

    区分大小写

    不能使用空格,不能使用冒号

    不建议以XML,  xml,  Xml开头

    7)格式化良好的XML文档,必须只有一个根元素

    3.3属性

    1属性是元素的一部分,必须出现在元素的开始标签中

    2属性的定义格式:属性名=属性值,属性值必须使用单引号或双引号

    3一个元素可以有0-n个属性,但一个元素中不能出现同名属性

    4属性名不能使用空格、冒号等特殊字符,且必须以字母开头

    3.4注释

    XML的注释与HTML相同,以“<!--”开始,以“-->”结束。

    注释内容会被XML解析器忽略

    3.5转义字符(实体引用)

    XML中的转义字符与HTML一样。

    因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"”>”、” ’ ”、” ” ”、”&”。

    Tips:在 XML 中,只有字符 "<" "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

    3.6 CDATA

    当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

    CDATA段中出现的“<”、“>’,、“””、“‘”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。

    CDATA段中不能包含“]]>”,即CDATA段的结束定界符。

    例:

    建一个xml文件:

      

    <?xml version="1.0" encoding="UTF-8"?>
    <school name="oracle" size="3">
        <persons>
            <person>
                <name>张三</name>
                <age>18</age>
            </person>
            <person>
                <name>李四&lt;</name>            
                <![CDATA[
                    if(a>"3"){
                        a=2;
                    }
                ]]>            
                <age>19</age>
            </person>
        </persons>
    </school>

     

    预览:

    右键--Open With--Other--

     

    4约束

    常用DTD约束和Schema约束

    5 DTD

    DTD (Document Type Definition ),文档类型定义,用来约束XML文档。

    规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。

    开发中,很少自己编写DTD约束文档,通常都是通过框架提供的DTD约束文档,编写对应的XML文档。

    常见框架使用DTD约束有:struts2hibernate等。

    5.1DTD语法

    5.1.1文档声明(第2和第3种常用)

    1)内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

    <?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>

    <!DOCTYPE web-app [

    ...//具体语法

    ]>

    <web-app>

    </web-app>

    2)外部DTD——本地DTDDTD文档在本地系统上,公司内部自己项目使用。

    3)外部DTD——公共DTDDTD文档在网络上,一般都有框架提供。

     

    5.1.2元素声明

    符号

    符号类型

    描述

    示例

    ?

    问号

    表示该对象可以出现,但只能出现一次

    (菜鸟?

    *

    星号

    表示该对象允许出现任意多次,也可以是零次

    (爱好*)

    +

    加号

    表示该对象最少出现一次,可以出现多次

    (成员+)

    ()

    括号

    用来给元素分组

    (古龙|金庸|梁羽生),

    (王朔|余杰),毛毛

    |

    竖条

    表明在列出的对象中选择一个

    (男人|女人)

    ,

    逗号

    表示对象必须按指定的顺序出现

    (西瓜,苹果,香蕉)

     实例:

    <!ELEMENT  web-app(servlet*servlet-mapping*,welcome-file-list?)>

        web-app包括3个标签,且必须顺序出现。

            servlet子标签个数任意

            servlet-mapping子标签个数任意

            welcome-file-list子标签最多只能出现一次

    <!ELEMENT servlet(servlet-namedescription?(servlet-class|jsp-file))>

        servlet3个子标签,且必须顺序出现

            servlet-name,必须有,且只能出现1

            description,可选1

            servlet-classjsp-file二选一,且只能出现一次

    <!ELEMENT servlet-name(#PCDATA)>

        servlet-name的标签体必须是文本

    <!ELEMENT  welcome-file-list  (welcome-file+)>

          welcome-file-list至少有1个子标签welcome-file

     5.1.3属性声明 

    语法了解一下即可。

    5.2实际使用

    1

     

    把这个dtd文件复制项目中的包中

    在同级目录下建一个web.xml(注意,一个项目只能有一个web.xml文件)

     

    2)复制这一句到web.xml中:

     

    3)然后Alt+/就有提示了

     

    实例代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
    <web-app>
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>demo01.Hello</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    </web-app>

    简单解释(以后会再学): 

    浏览器访问地址:http://localhost:8080/Day22/hello

    后面的/hello就是servlet-mapping中的url-pattern,所以这里要加个/,根据这个找到

    servlet-name,再找到servlet中的servlet-name,再找到servlet-class,里面的包名+类名,就找到要执行的类了,这就是程序的入口。

    welcome-file-list是欢迎页面,当只访问项目http://localhost:8080/Day22时,先显示第一个welcome-file里的页面,如果没有,再接着找第二个页面。

    6 Schema约束(常用)

    Schema是新的XML文档约束

    Schema要比DTD强大很多,是DTD替代者

    Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml

    Schema功能更强大,数据类型更完善

    Schema支持名称空间

    6.1实际使用

    dtd大体一样,也是先把.xsd加到项目中,再建web.xml文件

     

    复制声明,再Alt+/,一一点出来即可

     

     

    实例代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
                version="2.5">
        <servlet>
            <servlet-name>AddServlet</servlet-name>
            <servlet-class>demo01.AddServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>AddServlet</servlet-name>
            <url-pattern>/AddServlet</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    </web-app>

    7 dom4j解析

    当将数据存储在XML后,我们就希望通过程序获得XML的内容。

    IO流可以,但太繁琐

    7.1解析方式

    1DOM

    解析器把整个XML文档装载到内存,并解析成一个Document对象。

    优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

    缺点:XML文档过大,可能出现内存溢出现象。

    2SAX

    是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。

    优点:处理速度快,可以处理大文件

    缺点:只能读,逐行后将释放资源。

    3PULL

    Android内置的XML解析方式,类似SAX

    7.2常见的解析开发包

    JAXPsun公司提供支持DOMSAX开发包

    JDomdom4j兄弟

    Jsoup:一种处理HTML特定解析开发包

    dom4j:比较常用的解析开发包,hibernate底层采用

    7.3DOM解析原理及结构模型

    XML DOMHTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,

    并获得一个Document对象,通过Document对象就可以对DOM进行操作。

    DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点。

     

    7.4 API使用

    常用方法:

     

    1)导入jar

     

    2)步骤:

    1.获取解析器

    2.获得document文档对象

    3.获取根元素

    4.获取根元素下的子元素

    5.遍历子元素

    6.判断元素名称为servlet的元素

    7.获取servlet-name元素

    8.获取servlet-class元素

    1

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
                version="2.5">
        <servlet>
            <servlet-name>AddServlet</servlet-name>
            <servlet-class>demo01.AddServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>AddServlet</servlet-name>
            <url-pattern>/AddServlet</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    </web-app>
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Demo01 {
        public static void main(String[] args) throws DocumentException {        
            //1.获取解析器
            SAXReader saxReader=new SAXReader();
            //2.获得document文档对象
            Document doc=saxReader.read("src/demo02/web.xml");                    
            //3.获取根元素
            Element root=doc.getRootElement();    
            //4.获取根元素下的子元素
            List<Element> elements=root.elements();
            //5.遍历子元素
            for(Element e:elements){
                //6.判断元素名称为servlet的元素
                if(e.getName().equals("servlet")){
                    //7.获取servlet-name元素
                    Element servletName=e.element("servlet-name");
                    //8.获取servlet-class元素
                    Element servletClass=e.element("servlet-class");
                    System.out.println(servletName.getText());
                    System.out.println(servletClass.getText());
                }
            }
        }
    }

    例2通过反射模拟获取对象并调用方法

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://www.example.org/web-app_2_5" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
                version="2.5">
        <servlet>
            <servlet-name>AddServlet</servlet-name>
            <servlet-class>demo03.AddServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>AddServlet</servlet-name>
            <url-pattern>/AddServlet</url-pattern>
        </servlet-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    </web-app>
    public class AddServlet {
        public void init(){
            System.out.println("servlet初始化");
        }
        public void service(){
            System.out.println("servlet业务");
        }
        public void destroy(){
            System.out.println("servlet销毁");
        }
    }
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class Test {
        public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
            //1.创建解析器对象
            SAXReader saxReader=new SAXReader();
            //2.使用解析器加载web.xml文件得到document对象
            Document doc=saxReader.read("src/demo03/web.xml");
            //3.获取根元素节点
            Element root=doc.getRootElement();
            //4.根据元素名称获取子元素节点
            Element servlet=root.element("servlet");
            //5.根据元素名称获取servlet-class的文本节点
            Element servletClass=servlet.element("servlet-class");
            String classTest=servletClass.getText();        
            //6.通过类全名获取字节码文件
            Class c=Class.forName(classTest);
            //7.创建实例对象  
            Object obj=c.newInstance();
            AddServlet add=(AddServlet)obj;
            //8.调用实例对象里面的方法        
            add.init();
            add.service();
            add.destroy();
        }
    }

     

  • 相关阅读:
    bzoj 2733 [HNOI2012]永无乡
    CF550D Regular Bridge
    bzoj 1911 [Apio2010]特别行动队
    CF1137A/1138C Skyscrapers
    CF295C Greg and Friends
    CF1130E Wrong Answer
    bzoj 1029 [JSOI2007]建筑抢修
    iOS 流布局 UICollectionView使用(简单使用)
    Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)
    Swift 学习笔记(面向协议编程)
  • 原文地址:https://www.cnblogs.com/hzhjxx/p/10225347.html
Copyright © 2011-2022 走看看