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

      

       

原文地址:https://www.cnblogs.com/evilliu/p/8523022.html