zoukankan      html  css  js  c++  java
  • xml文件解析

    一:解析xml文件

      操作步骤:

        1)导入jar包(dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar)

        2)创建核心类SAXReader();

         SAXReader sax=new SAXReader()

        3)将xml文件加载到内存中形成一棵树。

         Document doc=sax.read(String path)

        4)获取根节点

            Element rootel=doc.getRootElement()

        5)通过根节点就可以获取其他的节点。(文本节点,属性节点,元素节点)

                        List<element> els=rootel.ements();//获取所有的节点。

           遍历els获取每个节点

            String elementText(String name)---文本。

            String attributeValue(String name)---获取节点的属性值。

     1 package jd.com.dealxml;
     2 
     3 import org.dom4j.Document;
     4 import org.dom4j.Element;
     5 import org.dom4j.io.SAXReader;
     6 
     7 import java.util.List;
     8 
     9 public class xml_Deal {
    10     public  static  void  main(String ... args)throws  Exception{
    11         SAXReader SX=new SAXReader();
    12         Document  doc=SX.read("D:\workflow\refect\src\jd\com\dealxml\test.xml");
    13         Element root_el=doc.getRootElement();
    14         System.out.println(root_el.attributeValue("version"));//获取根节点的属性。
    15         List<Element> el_list=root_el.elements();//获取所有的节点。
    16         for(Element el:el_list){
    17             System.out.println(el.elementText("nb"));
    18             System.out.println(el.attributeValue("class"));//存在的属性,没有返回null。
    19         }
    20     }
    21 }

    结果:

    1 2.0
    2 hi
    3 null
    4 hi
    5 null

    xpath解析技术:(推荐使用)

    上面的方法获取的xml的属性和文本的时候,想要获取特定的标签的属性和文本的值时候会很麻烦,于是导入jar包:jaxen-1.1-beta-6.jar

    依赖dom4j

    操作步骤:

      1)导入jar包(包含dom4j和jaxen)

      2)加载xml文件到内存中。

      3)使用API

        selectNode("表达式") 返回是list集合。

        selectSingalNode("表达式" ) 返回单个节点。

        表达式 查看xml文档

    表达式:

      - nodename(节点名称):表示选择该节点的所有子节点

      - "/":表示选择根节点

      - "//":表示选择任意位置的某个节点

      - "@": 表示选择某个属性

    例子:

        <?xml version="1.0" encoding="ISO-8859-1"?>
    
        <bookstore>
    
          <book>
            <title lang="eng">Harry Potter</title>
            <price>29.99</price>
          </book>
    
          <book>
            <title lang="eng">Learning XML</title>
            <price>39.95</price>
          </book>
    
        </bookstore>
     1 [例1]
     2 
     3 bookstore :选取 bookstore 元素的所有子节点。
     4 
     5 [例2]
     6 
     7 /bookstore :选取根节点bookstore,这是绝对路径写法。
     8 
     9 [例3]
    10 
    11 bookstore/book :选取所有属于 bookstore 的子元素的 book元素,这是相对路径写法。
    12 
    13 [例4]
    14 
    15 //book :选择所有 book 子元素,而不管它们在文档中的位置。
    16 
    17 [例5]
    18 
    19 bookstore//book :选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
    20 
    21 [例6]
    22 
    23 //@lang :选取所有名为 lang 的属性。

    代码实现:

     1 package jd.com.dealxml;
     2 
     3 import org.dom4j.Document;
     4 import org.dom4j.Element;
     5 import org.dom4j.Node;
     6 import org.dom4j.io.SAXReader;
     7 
     8 import java.util.List;
     9 
    10 public class xml_Deal {
    11     public  static  void  main(String ... args)throws  Exception{
    12         SAXReader SX=new SAXReader();
    13         Document  doc=SX.read("D:\workflow\refect\src\jd\com\dealxml\test.xml");
    14         Element root_el=doc.getRootElement();
    15         System.out.println(root_el.attributeValue("version"));//获取根节点的属性。
    16         List<Element> el_list=root_el.elements();//获取所有的节点。
    17         for(Element el:el_list){
    18             System.out.println(el.elementText("nb"));
    19             System.out.println(el.attributeValue("class"));//存在的属性,没有返回null。
    20         }
    21        xpat_Demo();
    22     }
    23     static void  xpat_Demo()throws Exception{
    24         Document doc=new SAXReader().read("D:\workflow\refect\src\jd\com\dealxml\test.xml");
    25         Node no_li=doc.selectSingleNode("/bea/ba-name/nc");//绝对路径获取。
    26         Node no_1=doc.selectSingleNode("//nc");//所有匹配。
    27         Node  no_2=doc.selectSingleNode("//@version");
    28         //获取指定属性值://title[@lang='eng'] 表示选择所有lang属性的值等于"eng"的title节点。
    29         Node  no_3=doc.selectSingleNode("//bea[@version='2.0'] ");
    30         System.out.println(no_3.getName());
    31         System.out.println(no_2.getStringValue());//获取指定的属性值。
    32         System.out.println(no_1.getText());
    33         System.out.println(no_li.getText());
    34 
    35         List<Node>  no3=doc.selectNodes("//nc");//获取所有nc节点的标签 selectNodes返回的匹配的标签的list集合。
    36         for(Node no:no3){System.out.println(no.getText());}
    37 
    38     }
    39 }

     注意:

    document 继承Branch  而Branch 继承Node,所以document 实现类的对象继承Node方法,所以document的对象可以 直接调用selectNodes和selectsignalNode方法!!!

    public interface Document extends Branch
    public interface Branch  extends Node

          

           

  • 相关阅读:
    ESB企业服务总线
    OpenStack的架构详解[精51cto]
    用MSBuild和Jenkins搭建持续集成环境(1)[收集]
    Hmac算法
    自定义JDBCUtils工具类
    读取JDBC配置文件的二种方式
    哈希算法
    BouncyCastle
    签名算法
    3种查看java字节码的方式
  • 原文地址:https://www.cnblogs.com/evilliu/p/8523022.html
Copyright © 2011-2022 走看看