zoukankan      html  css  js  c++  java
  • XML解析器之JAXP与DOM4J

    XML是一种数据格式,那么需要对XML文件进行操作就需要用到XML解析器---------针对dom方式和sax方式提供了不同的解析技术-----需要不同的XML解析器

     dom方式:会把文档中所有元素(标签),根据xml的层级结构,解析成各个Node对象(节点)。在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象

        缺点:如果文件过大,造成内存溢出。

        优点:树结构,容易遍历和实现增删改。

     sax方式:采用事件驱动,边读边解析,解析到某一个对象,返回对象名称,可以由用户自己建立自己的对象模型。SAX可以在解析文档的任意时刻停止解析。

        缺点:不能对节点实现增删改操作。

        优点:不受文件大小限制,方便实现查询操作。

    DOM(Documeng Object Model)解析器-------JAXP(Java API for XMLProcessing,意为XML处理的Java API)------Java自带的解析xml接口

        解析器存在于------JDK的javax.xml.parsers 包中

          dom方式:DocumentBuilder  : dom解析器类,

               DocumentBuilderFactory:dom解析工厂类

       过程:通过查看API可以发现,而DocumentBuilderFactory是个抽象类,但存在newInstance()方法通过反射的方式得到该接口的实例对象。

     DocumentBuilder是个抽象类,可以通过 DocumentBuilderFactory.newDocumentBuilder()方法得到解析器实例。

     该解析器类存在 parse(File f) 方法返回Document对象,还存在parse(String uri)方法也返回一个Document对象

     而Doucument是个接口,其父接口是Node接口,Document和Node存在一些方法对标签进行操作,详细查看API 。

            getElementsByTagName(String tagname):获取标签, 返回的是 NodeList 集合

            createElement(String tagName):创建标签

            createTextNode(String data):创建文本

            appendChild(Node newChild):将文本添加到标签下面

            removeChild(Node oldChild):删除节点

            getParentNode() :获取父节点

            getTextContent():得到标签里面的内容  

    static Document getdocument() throws Exception {

     // 通过工厂解析器类得到Doucment对象

    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentbuilder = builderFactory.newDocumentBuilder();
      // parse()解析xml,返回document 
    return documentbuilder.parse(URL);
    }

    //docuent及其父接口Node有诸多操作标签/属性/文本内容的方法

    看具体要求选用具体方法

    注意:删除元素需要得到----该元素的父节点删除,不能自己删自己

       在编译器中的增删改----都是对内存操作--因此都需要回写到具体文件中

    //回写操作

    static void writer(Document document) throws Exception {
      TransformerFactory factory = TransformerFactory.newInstance();
      Transformer transformer = factory.newTransformer();
      transformer.transform(new DOMSource(document), new StreamResult(URL));
    }

       sax方式:SAXParser : 解析器类

            SAXParserFactory : 解析器工厂类

     过程:查看API可以发现,SAXParserFactory是个抽象类,可以通过反射的方式newInstance()方法得到该类实例对象。

       SAXParser也是个抽象类, 其实例对象可以通过SAXParserFactory.newSAXParser()得到解析器实例。

        SAXParser对象中存在---parse(File f, DefaultHandler dh)----解析使用指定的指定XML文件的内容DefaultHandler

    默认事件自动处理其中存在三个方法:解析开始标签---startElement(String uri, String localName, String qNameAttributes attributes)----返回标签名称

       解析文本内容----characters(char[] ch,int start,int length)------通过string的构造方法,返回文本内容

       解析结束标签-----endElement(String uri,String localName, String qName)-------返回结束标签

             参数File --------xml的路径

             DefaultHandler----默认事件处理器

    class MyDefaultHandler extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
    throws SAXException {
    System.out.print("<"+qName+">");//输出返回的开始标签
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
    // TODO Auto-generated method stub
    System.out.print(new String(ch,start,length));输出返回的结束标签
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
    System.out.print("<"+qName+">");输出返回的文本内容
    }

    }

        

    DOM4J(Document Object Model for Java):是dom4j组织提供的一个用来解析处理XML、 XPath和XSLT开源框架,需要导包--dom4j-2.1.1.jar。DOM4J使用接口和抽象基本类方法,hibernate框架使用的解析方式就是DOM4J,该网址可下载dom4j的JAR包------------https://dom4j.github.io-----哈哈哈哈,该网站能快速掌握Dom4j解析器的使用。

       Dom4J中提供如些对象和方法对XML操作:

        SAXReader():SAXReader可以通过多种方式读取xml数据,并返回Document格式的对象。

        Document对象:getRootElement() :获取根节点 ,返回的是Element。

        Element是个接口对象,父接口是Node:getParent():获取父节点

                     addElement():添加标签

                     elements():获取标签下面的所有一层子标签

                     elements(qname):获取标签下面一层中名为qname的子标签

                     element(qname):表示获取表面下面的第一个子标签

                     addElement("xxx"):表示创建名为XXX的子标签

                     setText("YYY"):表示添加值为YYY的标签内容

                     addAttribute("name", "James"):表示添加属性

            对XPath支持--------------selectNodes("xpath表达式"): 多个节点

                        selectSingleNode("xpath表达式"):一个节点

           

    SAXReader reader = new SAXReader();  //注意导包----dom4j的import org.dom4j.Document;

    Document document = reader.read(url);//import org.dom4j.io.SAXReader;
      

    // 1、创建解析器
    SAXReader saxReader = new SAXReader();
    // 2、得到document
    Document document = saxReader.read("src/DTD.xml");
    // 3、得到根节点
    Element element = document.getRootElement();
    // 4、获取到第一个person
    // 使用element方法
    Element elementperson = element.element("person");
    // 5、在p1下面添加元素
    // 在p1上面直接使用 addElement("标签名称")方法 返回一个Element
    Element addelement = elementperson.addElement("段位");
    // 6、在添加完成之后的元素下面添加文本
    // 在sex上直接使用 setText("文本内容")方法
    addelement.setText("黄金");
    // 7、回写xml
    // 格式化 OutputFormat,使用 createPrettyPrint方法,表示一个漂亮的格式
    // 使用类XMLWriter 直接new 这个类 ,传递两个参数
    // 第一个参数是xml文件路径 new FileOutputStream("路径")
    // 第二个参数是格式化类的值

    对XML文件进行修改------需要将修改的内容写到文件

    //将修改内容写道文本对象中

    方式一FileWriter out = new FileWriter("src/DTD.xml");

        document.write(out);

        out.close();

    方式二:将修改内容有格式的写入到文档

        FileWriter fileWiter = new FileWriter("src/DTD.xml");

        XMLWriter writer = new XMLWriter(fileWiter);

        writer.write( document );

        writer.close();

    //将修改内容有格式的写入到文档中---有格式

    方式三:OutputFormat format = OutputFormat.createPrettyPrint();

        XMLWriter writer = new XMLWriter(new FileOutputStream("src/DTD.xml"),format);

             writer.write(document);
             writer.close();

    DTD.xml文件

    <history>
      <person>
        <name>貂蝉</name>
        <age>16</age>
        <段位>黄金</段位>
      </person>
      <person>
        <name>皇后</name>
        <name>杨贵妃</name>
        <age>20</age>
      </person>
      <person>
        <name>妃子</name>
        <name>落雁</name>
        <age>19</age>
      </person>
    </history>

         Dom4j中可以使用元素迭代器来遍历下一层的元素和属性:elementIterator()----attributeIterator()---hasNext()

         Dom4j中支持XPath语法:不过,需要的导包jaxen-1.2.0.jar---下载路径----https://mvnrepository.com/artifact/jaxen/jaxen/1.2.0

          第一种形式 -----/AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB

             第二种形式---------//BBB: 选取所有 BBB 子元素,而不管它们在文档中的位置。

            第三种形式----------------/*: 所有元素

            第四种形式-----------------BBB[1]: 表示第一个BBB元素  BBB[last()]:表示最后一个BBB元素

          第五种形式--------------//BBB[@id]: 表示只要BBB元素上面有id属性,都得到

          第六种形式----------- //BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

         常见这六种----详细查看-----https://www.w3school.com.cn/xpath/xpath_syntax.asp

             //1、创建解析器
                SAXReader reader = new SAXReader();
                //2、得到document
                Document document = reader.read("src/DTD.xml");
                //3、得到根节点  getRootElement() 返回Element
                Element element = document.getRootElement();
                //Xpath查询
                  Node node = document.selectSingleNode("//name[1]");
                //修改name元素的值为独孤求败
                  node.setText("独孤求败");
                /*
                 * List<Node> list = element.selectNodes("//name"); 
                 * list for(Node node :
                 * list) { System.out.println(node.getText()); }
                 */
                //回写文档中
                OutputFormat format = OutputFormat.createPrettyPrint();
                XMLWriter writer = new XMLWriter(new FileOutputStream("src/DTD.xml"),format);
                writer.write(document);
                writer.close();

    参考笔记:https://www.cnblogs.com/linkworld/p/7565533.html

  • 相关阅读:
    5,pandas高级数据处理
    4,根据美国各州人口,土地面积进行数据分析
    3,Python常用库之三:Matplotlib
    2,Python常用库之二:Pandas
    1,Python常用库之一:Numpy
    18,增量式爬虫
    17,基于scrapy-redis两种形式的分布式爬虫
    http超文本传输协议,get与post区别
    优化css,增加性能
    bootstrap常用知识点总结
  • 原文地址:https://www.cnblogs.com/Tanggula-pioneer/p/11771853.html
Copyright © 2011-2022 走看看