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解析方式的特点



    
        wgp
    
    
        

内容1

内容2

以上这段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文档的解析。

    XML编程(CRUD)_第1张图片
    点击查看源网页

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("");
    }

    //打印标签中内容
    @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 list = document.selectNodes("//foo/bar");
    //获取foo节点下的bar节点的author节点
    Node node = document.selectSingleNode("//foo/bar/author");
    //name节点的值
    String name = node.valueOf("@name");
}

你可能感兴趣的:(XML编程(CRUD))