文档章节

Xpath解析XML文件

marjey
 marjey
发布于 2016/11/14 20:15
字数 1003
阅读 25
收藏 0

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>

© 著作权归作者所有

marjey
粉丝 3
博文 173
码字总数 139219
作品 0
昆明
私信 提问
解析MyBatis配置文件mybatis-config.xml(一)

mybatis 配置文件 mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration <!-- 配置文件的根元素 --><configuration> </configuration> Mybatis 在初始化过程......

挽袖清风
2017/12/10
160
0
XML_解析使用NSXMLPaser(SAX)和GDataXML(DOM)

XML有两种解析方法SAX和DOM。 SAX方法可以使用iOS SDK中的NSXMLParser,DOM方法可以使用GOOGLE提供的GDataXML(下载地址:http://code.google.com/p/gdata-objectivec-client/downloads/deta...

LouDev
2013/03/11
2K
0
python中用xpath解析网页的基本方法

1. 背景 目前爬虫解析网页的技术有:Json, 正则表达式,BeautifulSoup,PyQuery,XPath XPath 教程 官方文档: 2. XPath简述 2.1. 什么是XPath? XPath (XML Path Language) 是一门在 XML 文...

zwq912318834
2017/10/08
0
0
GDataXML之解析XML

 第一部分 使用GDataXML写XML文件 / <!-- 7.客户端请求通讯录信息 --> <iq type="get" from="jaywon@localhost/3a5054e5" to="localhost" id="123456"> <query xmlns="jabber:iq:roster......

不孤独的美食家
2015/10/08
386
0
RobotFramework之XML

XML Library version: 3.0.4 Library scope: global Named arguments: supported Introduction Robot Framework test library for verifying and modifying XML documents. As the name impl......

海盐宝宝
2018/08/15
101
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
18分钟前
3
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
30分钟前
3
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
33分钟前
3
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
37分钟前
2
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
42分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部