xml

Posted on 2019-05-22 16:34  Fouro'clock  阅读(160)  评论(0)    收藏  举报

一、xml和html区别(引用其他人的)

1)语法不同

1. 在html中不区分大小写,在xml中严格区分。

2. 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。

3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。

4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 

5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。 

6. 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。

2)标记不同:

1、html使用固有的标记;而xml没有固有的标记。

2、Html标签是预定义的;XML标签是免费的、自定义的、可扩展的。

3)作用不同:

1. html是用来显示数据的;xml是用来描述数据、存放数据的,所以可以作为持久化的介质!Html将数据和显示结合在一起,在页面中把这数据显示出来;xml

则将数据和显示分开。 XML被设计用来描述数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观。

2. xml不是HTML的替代品,xml和html是两种不同用途的语言。 XML 不是要替换 HTML;实际上XML 可以视作对 HTML 的补充。XML 和HTML 的目标不同HTML 的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。

3. 没有任何行为的XML。与HTML 相似,XML 不进行任何操作。(共同点)

4. 对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具。

5. XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具。

二、xml的作用

  1、描述带关系的数据,配置文件。

  2、数据的载体。

三、xml语法

  xml文件是以.xml后缀结尾的文件。

  1、标签

<student>
    <name>小明</name>
    <sex></sex>
</student>
<student/>

  可以把xml文件用浏览器打开,浏览器带有xml文件的解析器。

  xml文件标签区分大小写。

  xml开始结束标签必须匹配。

  xml标签不能使用空格不能以数字开头。

  xml的根标签只能有一个。

  xml的空格和换行是有实际意义的。

  2、属性

  属性要卸载开始标签内。

<student id= "wo">
    <name>小明</name>
    <sex></sex>
</student>

  属性值用“” 或‘’ 括住,可以有多个属性,数值key不能重复,xml的根标签只能有一个。

  3、注释

  <!--    -->

  4、文档生命

  <?xml version = "1.0" encoding = "utf=8"?> 声明文件的版本号和编码格式

  5、转义字符

    详细见:http://tool.oschina.net/commons?type=2

  6、CDATA块

    包含特殊字符的同意原样输出。

    例子<![CDATA[xml]] >

  7、处理指令

    基本不用,引用css文件用的。

四、xml解析

  DOM解析

  SAX解析

  1、解析工具。

  DOM解析

    JAXP (官方的)

    JDOM

    DOM4J

    一般默认的解析工具与就是DOM4J。

  SAX解析

    sun官方的解析工具。

  2、具体实现

    DOM解析就是把一个xml文本封装成一个对象,将各部分存到对象里边,类似实体类一样的。

    xml文本对象是Document对象。

    节点为Node对象。

    节点的属性为Attribute对象

    标签的文本时Text对象。

  解析范例

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;
import java.util.List;

public class AnalysisXml {
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("."));
Element elementroot = document.getRootElement();//获取根标签
List<Attribute> attributes = elementroot.attributes(); //获取跟标签的属性
Iterator iterator = document.nodeIterator(); //获取所有的节点
while (iterator.hasNext()){
Object object = iterator.next();
Node node = null;
Element element;
//判断是否是标签节点
if (object instanceof Element){
element = (Element)object;
}else if (object instanceof Node){
node = (Node)object;
}
Iterator iteratornext = node.getDocument().nodeIterator();//获取子节点的字节点集合
String text = node.getText();//获取内容
}
}
}

   修改xml:

    

 @Test
    void writeDocument() throws Exception{
        //建立输出流
        FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.xml");
        //建立输出格式
        /**
         *         OutputFormat.createCompactFormat() 紧凑的格式  占用内存小
         *         OutputFormat.createPrettyPrint() 漂亮的格式
         */
        //修改xml
        /**
         * 增:标签 属性
         * 改:属性值 文本
         * 删:标签 属性
         */
        //创建xml
        Document document = DocumentHelper.createDocument();
        //增:标签 属性
        //增加根标签
        Element root = document.addElement("Students");
        Element two =  root.addElement("Student");
        two.addAttribute("name","liu");
        two.addText("第一条");
        //删除标签
        root.remove(two);

        //修改属性值
        Attribute attribute = two.attribute("name");
        attribute.setValue("wang");
        //删除属性值
        two.remove(attribute);
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        //指定生成文件的编码
        outputFormat.setEncoding("utf-8");
        //输出工具类
        XMLWriter xmlWriter = new XMLWriter(fileOutputStream,outputFormat);
        //写xml到具体的位置
        xmlWriter.write(document);
        //关闭连接
        xmlWriter.close();
    }

  

 3、Xpath技术 -- 简化解析xml的技术。dom4j内置支持了Xpath。

  

@Test
    public void xpathuser(Document document){
        //xpath 快速获取节点
        //  //Students[@id='2'] 为xpath表达式
        Element element = (Element)document.selectSingleNode("//Students[@id='2']");
        //xpath表达式
        /**
         *   '/'开始 绝对路径  表示从xml的根路径或子元素
         *   '//'开始  相对路径   不分任何层次结构的选择元素
         *   '*' 通配符   表示匹配所有的元素
         *   '[]' 定义域   选择条件下的元素
         *   and 表示多属性定义
         *   http://www.w3school.com.cn/xpath/xpath_syntax.asp
         */
        List<Element> elements = document.selectNodes("//Students");
        element.detach();
    }

  dom解析的缺点,解析大文件可能会导致内存溢出,解决办法使用Sax解析

SAX解析:

  特点:加载一点,读取一点,处理一点。对内存的要求比较低,不用加载jar包,jdk自带。 org.xml.sax

  核心的api:SaxParser 读取和解析xml文件。

  

void saxparserXml (Document document) throws Exception{
        //创建sax的xml解析器
        SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
        saxParser.parse(new File("."),new DefaultHandler());
    }



    class myDefaultHandler extends DefaultHandler{
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }
    }

  xml约束:

  xml约束技术:dtd和scheme约束。

  引入约束的方式:

    内部引入   <!DOCTYPE mapper SYSTEM mapper.dtd">

    外部引入   <!DOCTYPE mapper PUBLIC mapper.dtd">