XML相关

来源:互联网 发布:网络管理下载 编辑:程序博客网 时间:2024/05/29 18:33

1.XML的简介

            1.* XML    可扩展的标记语言。(和HTML非常类似的)

                     * 可扩展的。

                     * 自定义的标签。   

               
            2.* XML传输数据,HTML是显示数据。

2. XML的版本:  

1.XML1.0(使用该版本)        XML1.1(不向下兼容)

2.做什么用?  描述有关系的数据

3.应用

1* 作为配置文件。

2* 可以在系统与系统之间进行数据的传输。
                * webserivice    soap    XML封装数据
                * json    和XML概念    

4.* XML的语法

4.1文档声明(*****)

4.1.1写法:    <?xml version="1.0"  ?>

文档声明必须出现在xml文件的第一行和第一列的位置。         

4.1.2属性:

* version="1.0"                XML的版本    (必须写)

* encoding="UTF-8"            编码集        (可选的)

* standalone="yes或者no"    代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)

                        * 因为不写该属性,可以引入外部的文件。

4.1.3乱码会伴随你们一生?
           * 产生的原因:保存文件时和打开文件时采用的编码不一致。

           * 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)  

4.2元素(***)

* 开始标签和结束标签。
                    * 包含标签主体:    <abc>文本</abc>
                    * 不包含标签主体:    <abc/>
                    
* 不能交叉嵌套    
                * 只能有一个根元素(必须有,并且只能有一个)
                
* 命名规范:
                    * 区分大小写                    错误的:<a></A>    代表两个标签
                    * 不能以数字和-中划线开头        错误的:<1a>        <-a>
                    * 不能以XML(Xml    XML  xml)开头    错误的:<xmlaa>
                    * 不能包含空格和冒号。

4.3属性(***)

                * 自定义:命名规范同上。
                * 在同一个元素上,不能有相同的属性。(*****)
                * 可以使用双引号或者单引号。

4.4注释(*)

                * 和HTML的注释相同
                <!-- XML的注释 -->
                
                * 注释不能嵌套。

4.5特殊字符

                * <        &lt;
                * >        &gt;
                * &        &amp;
                * "        &quot;
                * '        &apos;

4.6CDATA区

                * 把标签中的内容作为字符串。
                * 语法:
                    <![CDATA[
                        内容:当成字符串
                    ]]>

4.7 PI(处理指令)(忘了)

                * 替换HTML

5.XML的约束

            * DTD
            * schema
            
            <myspring>
                <bean>hello.java</bean>
                 <猫/><猫/>
            </myspring>
                
            * 格式良好的XML:遵循语法规范。    
            * 有效的XML:有约束。

6.*  DTD的约束

6.1快速入门的步骤:

                1* 需要出现哪些标签?

                2* 在DTD的文件中编写元素
                    <!ELEMENT 元素名称 元素类型>

                3* 判断元素是否是复杂还是简单元素?
                    * 如果是简单元素:(#PCDATA)    代表是字符串
                    * 如果是复杂元素:(子节点)

                4* 需要在book.xml引入DTD的文件
                    * <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">

6.2 DTD与XML文档的关联方式

                1* 可以在XML的文件中直接书写DTD的代码。(经常使用)
                    <!DOCTYPE 根节点 [
                        DTD的代码
                    ]>
                
                2* 引入本地的DTD文件(经常使用
                    <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
                
                3* 引入网络上的DTD文件
                    <!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文件的地址">

6.3 元素定义

              1.* 语法:<!ELEMENT 元素名称    元素类型>
                    
                    1)* (#PCDATA)       字符串
                    2)* EMPTY            空
                    3)* ANY                任意的
                    4)* (子元素)
                    
                    * 子元素:
                        * 子元素之间的关系
                                   子元素出现是有顺序的
                             |        子元素只能出现一个
                            
                        * 子元素出现的次数
                             +        子元素出现1次或多次
                             *        子元素出现0次或多次
                             ?        子元素出现0次或1次
                    
              2.示例:<!ELEMENT MYFILE ( (TITLE*, AUTHOR?, EMAIL)* | COMMENT )>     
                    
                    <MYFILE>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                    </MYFILE>

6.4属性定义(AttributeList)

                * 写法:    <!ATTLIST 元素名称
                                属性名称 属性类型 属性约束
                                属性名称 属性类型 属性约束
                            >

                * 属性类型
                    * CDATA        字符串
                    * 枚举(没有提供关键字)    (男人|女人)
                    * ID    代表唯一的值,不能只写数字
                    
                * 属性的约束
                    * #REQUIRED        必须出现的
                    * #IMPLIED            可选的
                    * #FIXED                固定值    #FIXED "值"
                    * 默认值(不用)

                *示例:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE 书架 [<!ELEMENT 书架 (书+)><!ELEMENT 书 (书名,作者,售价,简介)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 售价 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ATTLIST 书出版社 (清华出版社|人民出版社) #REQUIRED编号 ID #IMPLIED出版日期 CDATA#FIXED "2014-11-17"><!ENTITY username "张三" >]><书架><书 出版社="清华出版社" 出版日期="2014-11-17"><书名>javaweb开发大全</书名><作者>&username;</作者><售价>99.8元</售价><简介>这是不错啊</简介></书><书 编号="b1" 出版社="人民出版社"><书名>葵花宝典</书名><作者>岳不群</作者><售价>99.8两</售价><简介>欲练此功...</简介></书></书架>

6.5实体定义(用的不多)    

                * <!ENTITY 别名 "值" >
                * 需要在xml中引入别名,浏览器打开文件后,在引入的位置上显示值的。

7.解析XML

         1 * 解析XML的方式有哪些呢?
                * 常用的有两种?DOM和SAX
                * 区别:
                    DOM解析XML
                      * 在内存中形成树状结构
                      * 缺点:如果文档过大,容易产生内存溢出的问题。  
                      * 优点:方便做增删改的操作    
                        
                    SAX解析
                      * 基于事件驱动,边读边解析
                      * 优点:不会产生内存溢出问题。
                      * 缺点:不能做增删改操作。(DOM4J在内存生成树状结构)




         2* JAXP                SUN提供的

 :只能使用DOM方式,如果SAX,只能做查询。

         3* DOM4J(*****)
                * 想做增删改    企业都在用。DOM4J提供的
                * 全部都可以做。


         4 * JDOM(不讲了)    
           

8. JAXP的解析HTML

            1* DOM

                * DocumentBuilderFactory    :解析器工厂类
                * DocumentBuilder    获取解析器对象
                * 解析XML(Document parse(String uri) )

          

        // 获取解析器工厂类DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 获取解析器对象DocumentBuilder builder = factory.newDocumentBuilder();// 解析XML的文档,返回document对象Document document = builder.parse("src/book2.xml");


            2* 回写(代码方式固定)

                * 获取回写的工厂类
                * 获取回写对象
                * 调用回写的方法进行回写。

                    // 创建回写类的工厂                    TransformerFactory transformerFactory =  TransformerFactory.newInstance();                    // 获取回写类                    Transformer transformer = transformerFactory.newTransformer();                    // 调用回写的方法                    transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));

  3. 代码示例

            1.工具类:JaxpDomUtil

package cn.itcast.utils;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;/** * JAPTDOM解析的工具类 * @author Administrator * */public class JaxpDomUtil {/** * 通过path获取document对象 * @param path * @return * @throws Exception */public static Document getDocment(String path) throws Exception{//1.获取工厂类:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.获取解析器类;DocumentBuilder builder = factory.newDocumentBuilder();//解析xml文件,并返回return builder.parse(path);}/** * 回写到xml文件 * @throws Exception  */public static void writeXML(Document document, String path) throws Exception{//1.获取回写类工厂TransformerFactory transformerFactory = TransformerFactory.newInstance();//2.获取回写类Transformer transformer = transformerFactory.newTransformer();//3. 回写transformer.transform(new DOMSource(document), new StreamResult(path));}}

2.xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书><书名>javaweb开发大全</书名><作者>班长</作者><售价>99.8元</售价><简介>这是不错啊</简介></书><书><书名>葵花宝典</书名><作者>岳不群</作者><售价>99.8两</售价><简介>欲练此功...</简介></书></书架>

3. 测试类:JaxpDomTest

package cn.itcast.jaxp;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import cn.itcast.utils.*;/** * JAXP的DOM方式解析XML文件 * @author Administrator * */public class JaxpDomTest {public static void main(String[] args) {try {run3();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 解析xml文件,然后获取xml文件中作者标签的内容 * @throws Exception */public static void run1() throws Exception{//1.先获取解析器工厂类对象实例:factoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.通过解析器工厂类来获取解析器对象DocumentBuilder builder = factory.newDocumentBuilder();//3.解析xml文档,返回document对象Document document = builder.parse("src/book2.xml");//uri//4.获取作者元素对象的集合,返回NodeListNodeList nodeList = document.getElementsByTagName("作者");//5.循环遍历,拿到每一个作者,打印文for(int i=0; i<nodeList.getLength(); i++){Node node = nodeList.item(i);String author = node.getTextContent();System.out.println(author);}}/** * 需求:在第二本书下,末尾添加子结点 * @throws Exception  */public static void run2() throws Exception{//1.获取工厂类DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.获取解析器DocumentBuilder build = factory.newDocumentBuilder();//3.解析xml文档,返回document对象Document document = build.parse("src/book2.xml");//4.获取第二本书Node book2 = document.getElementsByTagName("书").item(1);//5.创建元素对象,Element cat = document.createElement("猫");//6.设置文本内容cat.setTextContent("我是猫");//7.将元素对象添加到第二本书book2.appendChild(cat);//8. 回写方式固定,如果不回写,就无法写回到xml文件中。  //8.1创建回写类工厂TransformerFactory transformerFactory = TransformerFactory.newInstance();  //8.2获取回写类Transformer transformer = transformerFactory.newTransformer();  //8.3调用回写方法transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));}/** * 删除结点:通过父结点删除子结点,即要通过待删除结点的父结点来删除结点 * @throws Exception  */public static void run3() throws Exception{String path = "src/book2.xml";//获取文档对象;Document document = JaxpDomUtil.getDocment(path);//获取猫Node cat = document.getElementsByTagName("猫").item(0);//获取书(猫的父结点)Node book2 = cat.getParentNode();//通过书删除猫book2.removeChild(cat);//回写JaxpDomUtil.writeXML(document, path);}}

0 0
原创粉丝点击