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 中的空格会被保留

  • 相关阅读:
    金牙与肉屑
    科学研究的动机以及雄心
    适度的自我吹嘘
    ubuntu12启用root账户
    有很多文件夹是受系统保护的
    vs2012换肤功能,vs2012主题及自定义主题
    Ubuntu navicat for mysql 安装和使用
    Asp.Net MVC4 Bundle捆绑压缩技术
    64位Windows Jmail组件报错解决方案
    C#检测上传文件的真实类型
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6958757.html
Copyright © 2011-2022 走看看