Xpath解析XML文件

Xpath 是一种比较好用的xml文档解析工具。相比较于DOM和SAX,Xpath主要用于在解析之前已经知道要解析的的节点名称和属性(貌似其他两种也是呀)。

   1.节点类型

    XPath中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。文档中存在元素节点,属性节点,根节点

   2.常用路径表达式

 

表达式描述 
节点名称(nodename)选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性

  
示例如下:

 

//@lang选取所有名为 lang 的属性

 3.限定语

用来查找某个特定的节点或者包含某个指定的值的节点。以方括号括起

//book[price>35.00]选择所有book 元素,且其中的 price 元素的值须大于 35.00
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。 
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。 
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。 
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。 
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 
/bookstore/book[price>35.00]选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。 
/bookstore/book[price>35.00]/title选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。 

4 .通配符

通配符描述 
*匹配任何元素节点 
@*匹配任何属性节点 
node()匹配任何类型的节点 
|选取若干路径  
使用示例
路径表达式结果 
/bookstore/*选取 bookstore 元素的所有子节点 
//*选取文档中的所有元素 
//title[@*]选取所有带有属性的 title 元素。 
//book/title | //book/price选取所有 book 元素的 tilte 和 price 元素。 
//title | //price选取所有文档中的 title 和 price 元素。 
/bookstore/book/title | //price选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素

有个问题。

XPathConstants

这个类的具体作用是什么?

不管了,等用到再说吧。

package per.XMLFileParse;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.File;

/**
 * Created by li on 2016/11/14.
 * 解析xml文件的工具类。
 */
public class XMLParser {
    private String path;

    /**
     * 构造器,要解析xml文档,首先必须先指导xml文档在哪吧。
     */
    public XMLParser(String path) {
        this.path = path;
    }

    /**
     * 传入一个xml文件的路径,获取Document对象
     * param path; xml 文件路径。
     * return document xml 的树节点对象。
     **/
    static Document getDocument(String path) {
        Document document = null;
        try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating(false);
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            document = documentBuilder.parse(new File(path));
        } catch (Exception e) {
            System.out.println("获取xml文档节点失败。");
        }
        return document;
    }

    /**
     * 创建一个用于解析文档的xpath对象的方法。
     * param ;null
     * return XPath对象
     */
    static XPath getXPath() {
        XPathFactory xPathFactory = XPathFactory.newInstance();
        return xPathFactory.newXPath();
    }


    public static void main(String[] args) {
        Node node = getSpecifyNode("G:\\completeTheAim\\god\\MyProject\\src\\main\\java\\per\\myproject\\interaction\\set_hi_wtgl_fjxx.xml", "/service/inpoutData/vo");
        System.out.println(node.hasChildNodes());
        NamedNodeMap namedNodeMap = node.getAttributes();
        System.out.println(namedNodeMap.item(1).getNodeValue());
        System.out.println(namedNodeMap.getLength());
    }

    /**
     * 工具方法,用于xml文档的获取根元素。
     */
    static Node getRootNode(String path) {
        Document document = getDocument(path);
        XPath xPath = getXPath();
        Node node = null;
        try {
            node = (Node) xPath.evaluate("/*", document, XPathConstants.NODE);
        } catch (XPathExpressionException e) {
            System.out.println("获取xml文档根节点失败。");
        }
        return node;
    }

    /**
     * 输入xml文件的path和文档中指定路径,获得那个节点。
     * param:filePath xml文件路径
     * param:nodePath 节点路径
     * return:node 指定path的node
     */
    static Node getSpecifyNode(String filePath, String nodePath) {
        Document document = getDocument(filePath);
        XPath xPath = getXPath();
        Node node = null;
        try {
            node = (Node) xPath.evaluate(nodePath, document, XPathConstants.NODE);
        } catch (XPathExpressionException e) {
            System.out.println("获取xml文档根节点失败。");
        }
        return node;
    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<service  class="com.hi.problem.service.PM_GET_XMXX">
    <inpoutData>
        <vo type="HI_WTGL_XMXX" name="in" />
    </inpoutData>
    <outputData>
        <vo type="HI_WTGL_XMXX" name="out" />
    </outputData>
</service>

转载于:https://my.oschina.net/marjeylee/blog/787735

### 使用XPath解析XML文件Java中,`javax.xml.parsers.DocumentBuilderFactory` 和 `javax.xml.xpath.XPathFactory` 是用于通过XPath解析XML文件的关键组件[^1]。 #### 创建Document对象 为了能够使用XPath表达式查询XML文档中的特定节点或属性,首先需要创建一个表示整个XML文档的`org.w3c.dom.Document` 对象。这可以通过下面的方式实现: ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; // 加载并解析XML输入源到DOM树结构 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); File xmlFile = new File("example.xml"); Document doc = builder.parse(xmlFile); doc.getDocumentElement().normalize(); ``` #### 初始化XPath实例 接着初始化一个XPath工厂并通过该工厂获取一个新的XPath对象实例: ```java import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; XPath xpath = XPathFactory.newInstance().newXPath(); // 获取XPath对象实例 ``` #### 编译和执行XPath表达式 可以利用XPath对象提供的方法来编译XPath字符串,并对其进行求值从而得到所需的结果集。这里展示了两种常见的操作方式——返回单个节点以及返回节点列表: - **获取单一节点** ```java try { String expression = "/books/book/title"; Node resultNode = (Node)xpath.compile(expression).evaluate(doc, XPathConstants.NODE); System.out.println(resultNode.getNodeValue()); } catch (XPathExpressionException e) { e.printStackTrace(); } ``` - **获取多个节点作为 NodeList** ```java try { String expression = "//book/author"; NodeList nodeList = (NodeList) xpath.compile(expression).evaluate(doc, XPathConstants.NODESET); for(int i=0; i<nodeList.getLength();i++){ Element element=(Element)nodeList.item(i); System.out.println(element.getTextContent()); } }catch(XPathExpressionException ex){ ex.printStackTrace(); } ``` 以上就是基本的XPath解析流程,在实际应用过程中可以根据具体需求调整相应的参数设置或者优化性能等方面的内容[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值