美文网首页我爱编程
Java 基础 53 XML文件解析

Java 基础 53 XML文件解析

作者: 小熊先生很不开心 | 来源:发表于2018-03-12 07:41 被阅读17次

    1.1XML解析的两种方式

    1.1.1 DOM方式和SAX方式

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

    1.1.2 区别

    • DOM:
      将整棵树一口气全部加载到内存当中, 我们可以非常方便的操作任意的标签和属性.

      • 但是, 如果整棵树特别大的时候, 会出现内存溢出的问题

      • 节点: 标签、属性、文本、甚至是换行都称之为节点

    • SAX: 一个节点一个节点的进行解析

    1.2 Dom4J的方法概述

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

    1.3 Dom4J的案例 (获取)

    1.3.1 功能分析

    • 得到某个具体的节点内容:打印"郑州"
    • 遍历所有元素节点:打印他们的元素名称。

      Ps: 因为不知道有多少个元素节点, 所以需要递归.

    1.3.2 案例代码

    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>
    

    1.4 Dom4J的案例(删除和修改)

    1.4.1 功能分析

    • 修改某个元素节点的主体内容:信阳-->安阳

    • 删除指定元素节点:删除元素开封

      注意: 调用方法完毕, 仅仅是在内存中进行了修改, 需要用到OutputFormat和XMLWirter两个类配合使用
      将数据写入到文件

    1.4.2 实例代码

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

    1.5 Dom4J的案例(添加)

    1.5.1功能分析

    • 向指定元素节点中增加子元素节:添加一个新城市<City>南阳</City>
    • 向指定元素节点上增加同级元素节点:在洛阳前面,添加一个<City>三门峡</City>

    1.5.2 案例代码

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

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

    1.6.1 功能分析

    • 操作XML文件属性:打印State的Name
    • 添加属性:State: GDP="99999亿"

    1.6.2 案例代码

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

    相关文章

      网友评论

        本文标题:Java 基础 53 XML文件解析

        本文链接:https://www.haomeiwen.com/subject/tysvfftx.html