zoukankan      html  css  js  c++  java
  • XML基础知识学习

    概念:
    XML 指可扩展标记语言
    XML 是一种标记语言,非常类似 HTML ,文本文件.
    XML 的设计宗旨是数据传输,而非显示数据 。存储和传输复杂的关系模型数据
    XML 标签没有被提前定义
    使用约束的XML文档设计具有自我描写叙述性。 
    XML 是 W3C 的推荐标准

    XML语法:
    一个XML文件分为例如以下几部分内容:

    文档声明 <?xml version="1.0"  ecoding="utf-8">
    元素:有開始有结束
    属性
    凝视  
    CDATA区 、特殊字符 
    处理指令(processing instruction)  
    • CDATA区:不被解析
    <![CDATA[    
        内容
    ]]>
    或者转义字符:
    &lt; script &gt;
        子元素
    &lt; /script &gt;
    • 处理指令
    简称PI (processing instruction)。处理指令用来指挥解析引擎怎样解析XML文档内容。
    比如,在XML文档中能够使用xml-stylesheet指令。通知XML解析引擎,应用css文件显示xml文档内容。 <?

    xml-stylesheet type="text/css" href="1.css"?>

    处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。 

    XML约束概述
    在XML技术里。能够编写一个文档来约束一个XML文档的书写规范,这称之为XML约束

    为什么使用DTD?

    通过 DTD,您的每个 XML 文件均可携带一个有关其自身格式的描写叙述。通过 DTD。独立的团体可一致地使用某个标准的 DTD 来交换数据。而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。您还能够使用 DTD 来验证您自身的数据。

    常见的约束技术:
    XML DTD 
    XML Schema
    • XML DTD :文档类型定义,不严格,简单
         l 使用内部DTD   

    l 使用外部DTD   SYSTEM

    l 使用公共DTD   PUBLIC 

    <?xml version="1.0"  encoding="UTF-8"?>
    <!DOCTYPE books SYSTEM "books.dtd">
    <books>
        <book>
            <bookname>红楼梦</bookname>
                <author>小张</author>
        </book>
    <book>
            <bookname>西游记</bookname>
                <author>小明</author>
        </book>
    </books>       
      books.dtd(顺序,内容都严格要求)
    导入本地的:
    <!-- 使用外部的dtd -->
    //../目录名/   訪问上上一级下的目录
    <!DOCTYPE 文档根节点 SYSTEM "dtd文件的url">  

    <!-- 使用内部的dtd -->
    <!DOCTYPE books [
    <!ELEMENT books (book+>
    <!ELEMENT book (bookname,author)>
    <!ELEMENT bookname (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    ]>  
    导入外部的
    <!DOCTYPE 文档根节点 PUBLIC "dtd名称" "dtd文件的url">  

    DTD元素









    DTD属性
    如:

    <!ATTLIST 元素名称 属性名 属性类型 属性约束>

    属性类型  CDATA  (字符串)

    属性约束   #REQUIRED  这个代表属性必须有。

             #FIXED    属性值的绑定    

    • XML Schema:语法难,约束性强


    xml解析(很重要)
    读写xml
    XML解析开发包
    Jaxp(sun)、Jdom、dom4j
    dom(Document Object Medal)即文档对象模型)
    •  支持回写
    • 会将整个XML加载内存,以树形结构方式存储,大文件的时候执行较慢 
    • XML比較复杂的时候。或者当你须要随机处理文档中数据的时候不建议使用
    • 全部的东西都映射成node
    sax: (Simple API for XML) 不是官方标准,但它是 XML 社区其实的标准,差点儿全部的 XML 解析器都支持它。
    • 相比DOM是一种更为轻量级的方案。 速度快
    • 採用串行方法读取 --- 逐行读取
    • 编程较为复杂
    • 无法改动XML数据,仅仅能读。

    选择 DOM 还是 SAX
    应用程序的目的:假设必须对数据进行更改,而且作为 XML 将它输出,则在大多数情况下,使用 DOM
    数据的数量对于大文件,SAX 是更好的选择
    将怎样使用数据:假设实际上仅仅使用一小部分数据。则使用 SAX 将数据抽取到应用程序中。这样的方法更好些
    要速度:通常,SAX 实现比 DOM 实现快

    JAXP(Java API for XML Processing )
    JAXP是 Sun 提供的一套XML解析API,非常好的支持DOM和SAX解析方式
    JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
    在 javax.xml.parsers 包中,定义了几个工厂类。程序猿调用这些工厂类。能够得到对xml文档进行解析的 DOM 或 SAX 的解析器对象

    1、使用DOM方式解析XML
    解析器工厂类DocumentBuilderFactory
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    解析器类DocumentBuilder
    DocumentBuilder db = dbf.newDocumentBuilder();
    解析生成Document对象
    Document doc = db.parse("message.xml");
    通过Document对象查询节点
    document.getElementById   返回Node对象 --- 必须文档元素有ID属性
    document.getElementsByTagName  返回NodeList对象

    简单的元素增删改查样例:
    <?

    xml version="1.0" encoding="UTF-8" standalone="no"?

    ><!-- 使用内容的dtd --><books>

    <bookkuan="">
    <bookname>红楼梦</bookname>
    <author>小张</author>
    <value>15.6</value></book>
     
    <bookkuan="">
    <bookname>爱我是</bookname>
    <author>撒地方</author>
    </book>
    </books>
    publicclass test1 {
     
    /**
    * @param args
    * @throws ParserConfigurationException
    * @throws IOException
    * @throws SAXException
    * @throws TransformerException
    */
    publicstaticvoid main(String[] args)throwsParserConfigurationException,
    SAXException,IOException,TransformerException{
    // addElement();
    // updateText();
    deleteElement();
    }
     
    /**删除元素
    * @throws ParserConfigurationException
    * @throws SAXException
    * @throws IOException
    * @throws TransformerException
    * @throws TransformerFactoryConfigurationError
    * @throws TransformerConfigurationException
    */
    privatestaticvoid deleteElement()throwsParserConfigurationException,SAXException,IOException,TransformerConfigurationException,TransformerFactoryConfigurationError,TransformerException{
    Document document = getDocument("dtd/books.xml");
    NodeList nodeList=document.getElementsByTagName("author");
    Element element=(Element) nodeList.item(0);
    //通过父亲来删除子节点
    element.getParentNode().removeChild(element);
    domToFile(document);
    }
     
    /**加入元素
    * @throws ParserConfigurationException
    * @throws SAXException
    * @throws IOException
    * @throws TransformerFactoryConfigurationError
    * @throws TransformerConfigurationException
    * @throws TransformerException
    */
    privatestaticvoid addElement()throwsParserConfigurationException,
    SAXException,IOException,TransformerFactoryConfigurationError,
    TransformerConfigurationException,TransformerException{
    Document document = getDocument("dtd/books.xml");
    Element element= document.createElement("value");
    element.setTextContent("15.6");
    document.getElementsByTagName("book").item(0).appendChild(element);
    domToFile(document);
    }
    //改动
    publicstaticvoid updateText()throwsParserConfigurationException,SAXException,IOException,TransformerConfigurationException,TransformerFactoryConfigurationError,TransformerException{
    Document document = getDocument("dtd/books.xml");
    NodeList nodeList=document.getElementsByTagName("author");
    Element element=(Element) nodeList.item(1);
    element.setTextContent("小红");
    domToFile(document);
    }
    /**由于是载入到内存,所以须要回写到xml文件里
    * @param document
    * @throws TransformerFactoryConfigurationError
    * @throws TransformerConfigurationException
    * @throws TransformerException
    */
    privatestaticvoid domToFile(Document document)
    throwsTransformerFactoryConfigurationError,
    TransformerConfigurationException,TransformerException{
    TransformerFactory factory=TransformerFactory.newInstance();
    Transformer tf=factory.newTransformer();
    tf.transform(newDOMSource(document),newStreamResult("dtd/books.xml"));
    }
     
    /**得到document
    * @param file
    * @return
    * @throws ParserConfigurationException
    * @throws SAXException
    * @throws IOException
    */
    publicstaticDocument getDocument(String file)
    throwsParserConfigurationException,SAXException,IOException{
    // TODO Auto-generated method stub
    // 解析器工厂
    DocumentBuilderFactory builderFactory =DocumentBuilderFactory
    .newInstance();
    // 解析器
    DocumentBuilder db = builderFactory.newDocumentBuilder();
    Document document =(Document) db.parse(file);
    return document;
    }
     
    }
    2、使用SAX方式解析XML

    // 1.得到sax解析器工厂
     
    SAXParserFactory factory =SAXParserFactory.newInstance();
     
    // 2.得到sax解析器
     
    SAXParser parse = factory.newSAXParser();
     
    // parse.parse("xml/books.xml", new MyHandle()); //这句话能够替换以下的三句
     
    // 3.得到读取器
     
    XMLReader reader = parse.getXMLReader();
     
    // 4设置读取器的事件处理器
     
    reader.setContentHandler(newMyHandle());
     
    // 5.真正读取文件
     
    reader.parse("xml/books.xml");
     
    classMyHandleextendsDefaultHandler{
     
    @Override
     
    publicvoid startDocument()throwsSAXException{
     
    System.out.println("start document");
     
    }
     
     
    @Override
     
    publicvoid startElement(String uri,String localName,String qName,
     
    Attributes attributes)throwsSAXException{
     
    // qName能够得到元素名称
     
    // 能够通过 attributes得到当前元素的全部属性
     
    System.out.println("<"+ qName +">");
     
    }
     
    @Overrid
     
    publicvoid characters(char[] ch,int start,int length)
     
    throwsSAXException{
     
    // 能够得到元素中的文本信息
     
    System.out.println(newString(ch, start, length));
     
    }
     
    @Override
     
    publicvoid endElement(String uri,String localName,String qName)
     
    throwsSAXException{
    System.out.println("<"+ qName +">");
    }
    @Override
     
    publicvoid endDocument()throwsSAXException{
     
    System.out.println("endDocument");
     
    }
    3.使用dom4j解析xml

    Dom4j是一个简单、灵活的开放源码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。

    与JDOM不同的是,dom4j使用接口和抽象基类,尽管Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性
    Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。如今非常多软件採用的Dom4j,比如Hibernate。包含sun公司自己的JAXM也用了Dom4j
    使用Dom4j开发。需下载dom4j对应的jar文件





    注意:
    1.一个XML元素能够包括字母、数字以及其他一些可见字符。但必须遵守以下的一些规范:
    区分大写和小写,比如。<P>和<p>是两个不同的标记。
    不能以数字或"_" (下划线)开头。
    不能以xml(或XML、或Xml 等)开头。

    不能包括空格。
    名称中间不能包括冒号(:)。

    2.Xml文件里的凝视採用:“<!--凝视-->” 格式。
    XML声明之前不能有凝视
    凝视不能嵌套
    3.全部 XML 元素都须有关闭标签
    XML 标签对大写和小写敏感
    XML 必须正确地嵌套顺序
    XML 文档必须有根元素
    XML 的属性值须加引號
    特殊字符必须转义
    XML 中的空格会被保留

  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6818181.html
Copyright © 2011-2022 走看看