Java XPath解析XML总结

XPath解析XML步骤

//student.xml文件
<?xml version="1.0" encoding="utf-8"?>
<students> 
  <student class="1201"> 
    <name>李小离</name>  
    <sex>男</sex>  
    <age>25</age> 
  </student>  
  <student class="1201"> 
    <name>林志玲</name>  
    <sex>女</sex>  
    <age>25</age> 
  </student>  
  <student class="1201"> 
    <name>廖新峰</name>  
    <sex>男</sex>  
    <age>25</age> 
  </student>  
  <student class="1302"> 
    <name>张军</name>  
    <sex>男</sex>  
    <age>25</age> 
  </student>  
  <student class="1302"> 
    <name>任峰</name>  
    <sex>男</sex>  
    <age>25</age> 
  </student>  
</students>

1. 创建一个XPathFactory的实例

XPathFactory xf = new XPathFactory();

2. 通过XPathFactory的实例获取一个XPath实例

XPath x = xf.newXPath();

3. 通过XPath实例的evaluate()方法对XML进行查询

String evaluate(String expression,InputSource source);
Object evaluate(String expression,InputSource source,return returnType);
参数说明
expression:为XPath语法的查询语句。
source      :输入查询的*.xml的来源
returnType:返回结果的类型有:XPathConstants.NODE(单个元素),XPathConstants.NODESET(元素的集合)

public void getSelectXML(String query_sentences) throws XPathExpressionException {
    XPathFactory pathFactory = XPathFactory.newInstance();
    XPath path = pathFactory.newXPath();
    //该student.xml文件为于src目录下。
    InputStream in =SelectXML.class.getResourceAsStream("/student.xml");
    InputSource source = new InputSource( in ); //InputSource使用一次就会关闭,再次使用就用再new一次。
    //XPath语法的具体链接:http://www.w3school.com.cn/xpath/xpath_syntax.asp
    String query_sentences = "/students/student/[name=‘李小离’]/age"。
    //通过姓名为“李小离”查询他的年龄。
    //String evaluate(String expression,InputSource source);
    String age = (Node) path.evaluate(query_sentences, source);
    sysotem.out.println("李小离的年龄是: " + age); 
}

Java xpath解析XML主要方法

//contact.xml
<?xml version="1.0" encoding="utf-8"?>
<contactList>
    <contact id="001" class="style">
        <name>张三</name>
        <age>20</age>
        <phone>134222223333</phone>
        <email>zhangsan@qq.com</email>
        <qq>432221111</qq>
    </contact>
    <contact id="002">
        <name>李四</name>
        <age>20</age>
        <phone>134222225555</phone>
        <email>lisi@qq.com</email>
        <qq>432222222</qq>
    </contact>
    <contactTwo>
        <name>王五</name>
        <age>32</age>
        <phone>465431341</phone>
        <emali>af@qq.com</emali>
        <qq>46164694</qq>
    </contactTwo>
    <test>测试</test>
    <test>其他用途</test>
</contactList>

1. xpath selectNodes查询多个节点对象

/**
 *selectNode的使用方法
 */
public class xpathDemo {
    public static void main(String[] args) throws Exception {
        Document doc = new SAXReader().read(new File("./src/contact.xml"));
        /**
         * @param xpath 表示xpath语法变量
         */
        String xpath = "";

        /**
         * 1.      /      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)
         */
        xpath = "/contactList";
        xpath = "/contactList/contact";

        /**
         * 2. //     相对路径       表示不分任何层次结构的选择元素。
         */
        xpath = "//contact/name";
        xpath = "//name";

        /**
         * 3. *      通配符         表示匹配所有元素
         */
        xpath = "/contactList/*"; //根标签contactList下的所有子标签
        xpath = "/contactList//*"; //根标签contactList下的所有标签(不分层次结构)
        /**
         * 4. []      条件           表示选择什么条件下的元素
         */
        //带有id属性的contact标签
        xpath = "//contact[@id]";
        //第二个的contact标签
        xpath = "//contact[2]";
        //选择最后一个contact标签
        xpath = "//contact[last()]";

        /**
         * 5. @     属性            表示选择属性节点
         */
        xpath = "//@id"; //选择id属性节点对象,返回的是Attribute对象
        xpath = "//contact[not(@id)]"; //选择不包含id属性的contact标签节点
        xpath = "//contact[@id='002']"; //选择id属性值为002的contact标签
        xpath = "//contact[@id='001' and @name='eric']"; //选择id属性值为001,且name属性为eric的contact标签
        /**
         *6.  text()   表示选择文本内容
         */
        //选择name标签下的文本内容,返回Text对象
        xpath = "//name/text()";
        xpath = "//contact/name[text()='张三']"; //选择姓名为张三的name标签

        List < Node > list = doc.selectNodes(xpath);
        for (Node node: list) {
            System.out.println(node);
        }

        //写出xml文件
        //输出位置
        FileOutputStream out = new FileOutputStream("d:/contact.xml");

        //指定格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(out, format);

        //写出内容
        writer.write(doc);

        //关闭资源
        writer.close();
    }
}

2. xpath selectSingleNode查询一个节点对象

/**
 *selectSingleNode的使用
 */
 public class xpathDemo1{
     public static void main(String[] args) throws Exception{
         //读取XML文件,获得document对象
        SAXReader saxReader = new SAXReader();    
        Document doc = saxReader.read(new File("./src/contact.xml"));
        
        //使用xpath获取某个节点
        String xpath = "";
        
        //对contact元素 id="001"的节点,操作
        xpath = "//contact[@id = '001']";
        Element contactElem =    (Element)doc.selectSingleNode(xpath);
        
        //设置这个节点的属性值
        contactElem.addAttribute("name", "001");
        
        //输出这个节点的所有属性值
        for(Iterator it = contactElem.attributeIterator();it.hasNext();){
        Attribute conAttr = (Attribute)it.next();
        String conTxt = conAttr.getValue();
        String conAttrName = conAttr.getName();
        System.out.println(conAttrName+" = "+conTxt);
        }
     }
 }



版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。