XML

xml的概述与如何编写xml文件

xml语言的概述

xml语言是具有结构性的标记语言, 可以灵活的存储一对多的数据关系。

这里写图片描述

以上这种数据, 如果通过我们学习的集合来存储的话, 需要通过多个集合的嵌套使用. 
那么很显然, 数据存储的过程就非常麻烦, 但是我们今天所学习的xml文件就可以很简单的存储这种一对多的数据

xml文件是用来做什么的?
存储数据
xml是怎样存储数据的?
以标签的形式存储
例: Jack

Xml文件的组成部分

文档声明
元素
元素的属性
注释
CDATA区
特殊字符

文档声明

在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行
这就好比我们在写java文件的时候需要声明class一样, 就是个硬性的规定.

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

    xml表示标签的名字
    version表示当前文件的版本号
    encoding表示当前编码, 需要跟文件的编码产生对应关系

xml的元素

1: xml中的元素其实就是一个个的标签
2: 标签分为两种

        a: 包含标签体
            理解: 简括号全部成对儿出现, 所有的数据都用一对儿简括号存储
            例:
                <student>
                    <name>zhangsan</name>
                    <age>18</age>
                </student>

        b: 不包含标签体
            理解: 只有最外层的一个简括号,括号用/标识结束, 内部的数据都用属性来编写

                <student 
                    name="zhangsan"
                    age="18"
                />

             两种方式都需要掌握, 但是第二种编写起来会更加方便

标签(元素的书写规范)

严格区分大小写;<p><P>
只能以字母或下划线开头;abc _abc
不能以xml(或XML、Xml等)开头----W3C保留日后使用;
名称字符之间不能有空格或制表符;
名称字符之间不能使用冒号 : (有特殊用途)

元素中属性的注意事项

一个元素可以有多个属性,每个属性都有它自己的名称和取值。
属性值一定要用引号(单引号或双引号)引起来。
属性名称的命名规范与元素的命名规范相同
元素中的属性是不允许重复的
在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述

xml的注释

格式:
    <!—被注释的内容 -- >
    注意: 注释不能嵌套定义

引入CDATA区

为什么要使用CDATA区域?

如果我们在标签中写入的内容, 想要带有标签的标记符号的话, 就需要对这段内容进行转义
就好比java中的打印语句, 想要打印出”这个字符就必须用/进行转义.

标签也是一样, 想要将<itheima>当做内容存储的话, 就需要对他进行转义.

如何转义?
这里写图片描述

注意:
这种转移可以达到效果, 但是如果操作的数据过多, 编写起来会非常痛苦, 所以, 可以使用CDATA区来解决此问题

解析xml文件

XML解析的两种方式

DOM方式和SAX方式
DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
XML解析开发包
JAXP:是SUN公司推出的解析标准实现。
Dom4J:是开源组织推出的解析开发包。
Dom for java four
Log4j

总结:
DOM: 将整棵树一口气全部加载到内存当中, 我们可以非常方便的操作任意的标签和属性.
但是, 如果整棵树特别大的时候, 会出现内存溢出的问题
节点: 标签、属性、文本、甚至是换行都称之为节点
SAX: 一个节点一个节点的进行解析

Dom4J的方法概述
Document
* Element getRootElement() :获取根元素对象(根标签)
* Element
* List elements() :获取所有的子元素
* List elements(String name):根据指定的元素名称来获取相应的所有的子元素
* Element element(String name):根据指定的元素名称来获取子元素对 象,如果元素名称重复,则获取第一个元素
* String elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
* String getText() :获取当前元素对象的文本
* void setText(String text):设置当前元素对象的文本
* String attributeValue(String name):根据指定的属性名称获取其对应的值
* public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修改

Dom4J的案例 (获取)

private static void method2() throws Exception {
        //2、遍历所有元素节点:打印他们的元素名称。
        //获取根元素
        Document document = Dom4JUtils.getDocument();
        Element rootElement = document.getRootElement();
        treeWalk(rootElement);
    }


    public static void treeWalk(Element element) {
        //输出元素的名称
        System.out.println(element.getName());

        //获取指定元素的所有子元素
        List<Element> es = element.elements();
        for (Element e : es) {
            treeWalk(e);
        }
    }

    private static void method() throws Exception {
        //1、得到某个具体的节点内容:打印"郑州"
        Document document = Dom4JUtils.getDocument(); 
        //获取根元素
        Element rootElement = document.getRootElement();
        //获取根元素下的所有子元素
        List<Element> elements = rootElement.elements();
        //根据索引获取第一个City元素
        Element cityElement = elements.get(0);
        //根据子元素的名称来获取子元素的文本
        String text = cityElement.elementText("Name");
        System.out.println(text);
    }

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

<State Code="37" Name="河南" 
    description="郑州" GDP="99999亿"> 
  <City> 
    <Name>郑州</Name>  
    <Region>高薪区</Region> 
  </City>  
  <City>三门峡</City>  
  <City>洛阳</City>  
  <City>安阳</City>  
  <City>南阳</City> 
</State>

Dom4J的案例(删除和修改)

public static void write2XML(Document document) throws IOException {
        OutputFormat format = OutputFormat.createPrettyPrint();
        //format.setEncoding("UTF-8");//默认的编码就是UTF-8
        XMLWriter writer = new XMLWriter( new FileOutputStream("src/com/itheima_04/city.xml"), format );
        writer.write( document );
    }


private static void method3() throws Exception, IOException {
        //3、修改某个元素节点的主体内容:信阳-->安阳
        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //获取根元素下的所有子元素
        List<Element> es = rootElement.elements();
        //根据索引可以获取指定的元素
        Element cityElement = es.get(3);
        //修改文本
        cityElement.setText("安阳");
        //写回文件
        Dom4JUtils.write2XML(document);
    }

private static void method4() throws Exception, IOException {
        //6、删除指定元素节点:删除元素开封 
        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //获取根元素下的所有子元素
        List<Element> es = rootElement.elements();
        Element cityElement = es.get(1);
        //无法自杀,找他爹
        Element parentElement = cityElement.getParent();
        parentElement.remove(cityElement);
        //写回文件
        Dom4JUtils.write2XML(document);
    }

Dom4J的案例(添加)

private static void method5() throws Exception, IOException {
        //4、向指定元素节点中增加子元素节:添加一个新城市<City>南阳</City>
        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //添加元素
        Element cityElement = rootElement.addElement("City");
        //设置文本
        cityElement.setText("南阳");
        //写回文件
        Dom4JUtils.write2XML(document);
}

private static void method6() throws Exception, IOException {
        //5、向指定元素节点上增加同级元素节点:在洛阳前面,添加一个<City>三门峡</City>
        //创建一个新的元素对象
        Element cityElement = DocumentHelper.createElement("City");
        //设置文本
        cityElement.setText("三门峡");

        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //获取根元素下所有的子元素
        List<Element> es = rootElement.elements();
        //将新的元素添加到子元素列表中
        es.add(1, cityElement);
        //写会文件
        Dom4JUtils.write2XML(document);
}

Dom4J的案例(属性获取和添加)

private static void method7() throws Exception {
        //7、操作XML文件属性:打印State的Name
        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //根据属性名称获取值
        String value = rootElement.attributeValue("Name");
        System.out.println(value);
}

public static void main(String[] args) throws Exception  {
        //7、操作XML文件属性:打印State的Name
        //8、添加属性:State: GDP="99999亿"
        Document document = Dom4JUtils.getDocument();
        //获取根元素
        Element rootElement = document.getRootElement();
        //添加新的属性和对应的值
        rootElement.addAttribute("GDP", "99999亿");

        //写回文件
        Dom4JUtils.write2XML(document);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值