XML编程(CRUD)

XML编程(CRUD):

对xml中的元素进行增删改查 create、read、update、delete

我们要进行增删改查的操作就需要先对这个xml文件进行解析,然后才能进行各种其他的操作。

那么xml的文件怎么去解析呢,xml解析分为三种,分别是DOM方式解析、SAX方式解析、PULL方式解析;这里我们只说一下DOM解析和SAX解析,以后有机会我们在说PULL解析。

1,什么是DOM解析?

​ DOM的全称是Document Object Model 即文档对象模型,是w3c组织推荐的解析xml的一种方式。

2,什么是SAX解析?

​ SAX的全称是Simple API for XML 不是官方标准,但是它是xml社区事实上的标准,几乎所有的XML解析器都支持它。

3,DOM解析方式的特点

<?xml version = "1.0" ?>
<root>
    <head>
        <title>wgp</title>
    </head>
    <body>
        <p> 内容1 </p>
        <p> 内容2 </p>
    </body>
    <foot>

    </foot>
</root>

以上这段xml文件内容,dom是这么进行操作的呢?首先dom方式是先把该xml文件的加载到系统内存中,该文件会转化为Document的对象,每一个元素会转化为了Element对象,每一个元素的属性也会转为Attribute对象,每一个元素中的内容会转化为Text对象,我们就是用这些对象进行操作xml文件的,dom解析方式比较容易对xml文件中的内容进行增删改查。

dom的优点:适合增删改查对xml文档。

dom的缺点:加载大问xml文件时会比较占内存。大文件不适合用这种方式。

4,SAX解析方式特点

​ SAX解析方式和DOM解析方式的区别是:

SAX解析方法只适合用来对xml文件的读取遍历,没有对xml文件进行删除修改等操作。SAX解析是对xml文件进行一行一行的读取,而且读过去的内容他是不能再回头去修改的,所以,如果只我们只是对xml文件的进行读取的话用SAX解析方式是比较高效的,如果我去SAX官网看,会发现官网也是建议我们如果要进行增删改的话还是用dom方式。

sax优点:占用内存小,解析速度快,适合查询。

sax缺点:只适合读取xml文档,不是适合增删改的操作。

小知识点:

如果调整JVM内存的大小?

JVM的大小默认运行程序的空间是64M, 当我们程序的内存占用的超过64M那么就会抛出OutOfMemoryError的错误,我们可以调整虚拟进内存大小,

官网文档 https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html

找到这段内容:我看到是java8的文档

-Xmxsize

Specifies the maximum size (in bytes) of the memory allocation pool in bytes. This value must be a multiple of 1024 and greater than 2 MB. Append the letter k or K to indicate kilobytes, m or M to indicate megabytes, g or G to indicate gigabytes. The default value is chosen at runtime based on system configuration. For server deployments, -Xms and -Xmx are often set to the same value. See the section "Ergonomics" in Java SE HotSpot Virtual Machine Garbage Collection Tuning Guide at ```http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html`.

The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units:

-Xmx83886080
-Xmx81920k
-Xmx80m

The -Xmx option is equivalent to -XX:MaxHeapSize.

5,解析XML文件的解析工具包

  • Jaxp(sun) :sun公司提供的开发包

  • Jdom :开源组织写的

  • dom4j :开源组织写的

    他们之间的效率是: dom4j > Jdom >Jaxp

    平常用的是最多的是dom4j;

    JAXP包的使用:

    ​ Jaxp开发包是J2SE的一部分,它是由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。

    ​ 在javax.xml.parsers包中,定义了几个工厂类,调用这些工厂类,就可以得到xml问的DOM或SAX的解析器,从而实现对xml文档的解析。

    点击查看源网页
    点击查看源网页

DOM方式的操作xml文档示例代码

 public static void main(String[] args) {

        try {
            //1,创建工厂
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

            //2,得到dom解析器
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

            //3,解析xml文档,得到代表文档的document
            Document parse = documentBuilder.parse("src/book.xml");

            //4,根据Document对象进行各种操作了 增删改查


            //5,再写入xml文档中
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(new DOMSource(parse),new StreamResult(new FileOutputStream("src/book.xml")));


        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }

    }

6,SAX解析

​ SAX采用事件处理的方式解析XML文件的,利用SAX解析XML文件,涉及到两部分:解析器和事件处理器

  • 解析器可以使用JAXP的API创建,创建出SAX解析器后就可以指定解析器去解析某个XML文档。

  • 解析器采用SAX方式在解析某个XML文档时,它只要解析到文档的一个组成部分,就会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的文件内容作为方法的参数传递给事件处理器。

  • 事件处理器由我们自己编写,通过事件处理器中的方法参数,就可以得到SAX解析器解析到的数据并可以对数据进行处理。

    点击查看源网页
    点击查看源网页

从上图我们可以看到SAX解析有四种不同的处理器

1.ContentHandler:内容处理器,当解析到内容的时候调用该处理器。

2.ErrorHandler:错误处理器,当解析发生错误的时候调用的处理器。

3.DTDHandler:DTD约束处理器,当解析到DTD约束内容的时候调用该处理器。

4.EntityResolver:实体处理器,当解析到实体的时候调用该处理器。

我们经常用到的是ContentHandler处理器,该处理器常用的方法是:startElement、endElement、characters

SAX解析代码示例:

public static void main(String[] args) {
    try {
        //1.创建解析工厂
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //2.得到解析器
        SAXParser saxParser = saxParserFactory.newSAXParser();

        //3.得到读取器
        XMLReader xmlReader = saxParser.getXMLReader();

        //4.设置内容处理器
        xmlReader.setContentHandler(new ListHandler());

        //5.读取xml文档内容
        xmlReader.parse("src/book.xml");

    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
//自定义内容处理器
class ListHandler extends DefaultHandler {

    //打印开始标签
    @Override
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        System.out.println("<"+ qName +">");
    }

    //打印结束标签
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

        System.out.println("</"+ qName +">");
    }

    //打印标签中内容
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.println(new String(ch,start,length));
    }

}

7,DOM4J 解析xml文档

​ dom4j是一个简单灵活的开放源代码的库,是由早期开放Jdom的人离开的那一波人独立开发的。与jdom不同的是,dom4j使用接口和抽象基类,虽然dom4j的api相对要复杂一些,但它比Jdom更灵活性。

​ dom4j是一个非常优秀的Java XML Api,具有性能优越、功能强大和极易使用的特点。现在很多软件采用的都是dom4j,例如Hibernate,sun公司自己的JAXM也用了dom4j。

​ 使用dom4j需要下载相关的jar包。快速入门 看文档爽到不行😆

​ dom4j的GitHub地址: https://dom4j.github.io/

XPATH提取xml文档数据

xpath的实例文档 提供中文哦 http://www.zvon.org/xxl/XPathTutorial/

​ xpath是一种快速定位的xml文档节点的表达式,比如你想直接去拿第100个节点,用xpath这种表达式直接就可以去拿那个节点。

Dom4j的使用xpath的官方文档示例:

public void bar(Document document) {
    //获取foo节点下所有bar节点
    List<Node> list = document.selectNodes("//foo/bar");
    //获取foo节点下的bar节点的author节点
    Node node = document.selectSingleNode("//foo/bar/author");
    //name节点的值
    String name = node.valueOf("@name");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 2018年5月17星期四 亲子日记第129天三年级二班许思睿 这几天的雨一波一波的跟着来,思睿的鞋子换了一双又一双...
    瑞彤妈妈阅读 191评论 0 0
  • 宝宝几个月的时候还不会说话只会咿咿呀呀,但是父母可以靠心电感应和经验明白宝宝的意思 现在的宝宝都很聪明,刚...
    亮亮童车阅读 215评论 0 0
  • 谷中无日月,一叶隔嚣尘。 恨血花经眼,轻生鸟作邻。 他乡十年土,云梦几回春。 今夜应难寐,添香有那人。
    无羡生阅读 654评论 14 8