ibm xml专区中对XPATH的一个好文,http://www.ibm.com/developerworks/cn/xml/x-xpathjava/

主要小结如下:
1 JDK 1.5中已经自带了很好的import javax.xml.xpath.XPathFactory;
了,用1.5吧

2 核心代码
  public XPathEvaluator(String xmlFilename) throws IOException {
    try {
      // Convert filename into a DOM tree
      DocumentBuilderFactory domFactory =
        DocumentBuilderFactory.newInstance();
      domFactory.setNamespaceAware(true);
      DocumentBuilder builder = domFactory.newDocumentBuilder();
      this.domTree = builder.parse(xmlFilename);
    } catch (SAXException e) {
      throw new IOException("Error in document parsing: " + e.getMessage());
    } catch (ParserConfigurationException e) {
      throw new IOException("Error in configuring parser: " + e.getMessage());
    }
  }

public NodeList evaluateXPath(String xpathString) throws IOException {
    try {
      XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      return (NodeList)xpath.evaluate(
        xpathString, domTree, XPathConstants.NODESET);
    } catch (XPathExpressionException e) {
      throw new IOException("Error evaluating XPath: " + e.getMessage());
    }
  }

public static void main(String[] args) {
    try {
      if (args.length != 1) {
        System.err.println("Usage: java ibm.dw.xpath.XPathEvaluator " +
          "[XML filename]");
        System.exit(1);
      }
      XPathEvaluator evaluator = new XPathEvaluator(args[0]);
      String xpathString = "//target[@name='init']/property[" +
                           "starts-with(@name, 'parser')]";
      NodeList results = evaluator.evaluateXPath(xpathString);
      for (int i=0; i<results.getLength(); i++) {
        Node node = results.item(i);
        System.out.print("Result: ");
        switch (node.getNodeType()) {
          case Node.ELEMENT_NODE: System.out.println("Element node named " +
                                    node.getNodeName());
                                  break;
          case Node.ATTRIBUTE_NODE: System.out.println(
                                     "Attribute node named " +
                                       node.getNodeName() + " with value '" +
                                       node.getNodeValue() + "'");
                                  break;
          case Node.TEXT_NODE:    System.out.println("Text: '" +
                                    node.getNodeValue() + "'");
                                  break;
          default: System.out.println(node);
        }
      }

可见其基本步骤为,1 读入一个XML

2 建立DOMTREE,即:
                             DocumentBuilderFactory domFactory =
         DocumentBuilderFactory.newInstance();
       domFactory.setNamespaceAware(true);
       DocumentBuilder builder = domFactory.newDocumentBuilder();
       this.domTree = builder.parse(xmlFilename);

3 String xpathString = "//target[@name='init']/property[" +
            "starts-with(@name, 'parser')]";
     NodeList results = evaluator.evaluateXPath(xpathString);

这里向该方法传入xpath.其中evaluatexpath方法的功能为把domtree中用xpath解析后,返回一个nodelist,然后再解析.

4 建立XPATH工厂
                 XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      return (NodeList)xpath.evaluate(
        xpathString, domTree, XPathConstants.NODESET);

XPathFactory是一个抽象工厂.

抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM.

为了选择不同的模型,需要向XPathFactory.newInstance()方法传递标识对象模型的统一资源标识符(URI).
目前只支持DOM.

之后创建xpath对象.

之后应用xpath表达式
   其中evaluate() 方法被声明为返回 Object,实际返回什么依赖于 XPath 表达式的结果以及要求的类型

一般来说,XPath与Java的映射关系是:

number 映射为 java.lang.Double
string 映射为 java.lang.String
boolean 映射为 java.lang.Boolean
node-set 映射为 org.w3c.dom.NodeList

在 Java 中计算 XPath 表达式时,第二个参数(XPathConstants常量)指定需要的返回类型.有五种可能,都在 javax.xml.xpath.XPathConstants 类中命名了常量:

XPathConstants.NODESET
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.NODE

XPathConstants.NODE提示:

最后一个 XPathConstants.NODE 实际上没有匹配的 XPath 类型.只有知道 XPath 表达式只返回一个节点或者只需要一个节点时才使用它.如果 XPath 表达式返回了多个节点并且指定了 XPathConstants.NODE,则 evaluate() 按照文档顺序返回第一个节点.如果 XPath 表达式选择了一个空集并指定了 XPathConstants.NODE,则 evaluate() 返回 null.

注意:如果不能完成要求的转换,evaluate()将抛出 XPathException

最后,可以转换为DOM的NodeList进行解析.

一个更典型的小例子如下:

DocumentFactory factory=DocumentFactory.newInstance();

factory.setNamespaceAware(true);

DocumentBuilder builder=factory.newDocumentBuilder();

Document doc=builder.parse("src/books.xml");

XpathFactory xpathfactory=XpathFactory.newInstance();

Xpath xpath=xpathfactory.newXpath();

XPathExpression pathExpression = xpath

.compile("//book[author='TEST']/title/text()");

Object result=pathExpression.evalucate(doc,XPathConstants.NODESET);

NodeList nodes=(NodeList)result;

for (i=0;i<=nodes.getLenth();i++)

System.out.println(nodes.item(i).getNodevalue):

ibm xml专区中对XPATH的一个好文相关推荐

  1. python汇率转换_利用Python中的Xpath实现一个在线汇率转换器

    前言 在之前的语法里面,我们记得有一个初识Python之汇率转换篇,在那个程序里面我们发现可以运用一些基础的语法写一个汇率计算,但是学到后面的小伙伴就会发现这个小程序有一定的弊端. 首先,它不可以实时 ...

  2. 使用OpenXml打开word文档中嵌入的另一个文档

    今天在写字处理评分程序的时候遇到一个之前没有经历过的场景:在给定的字处理素材文档文档中嵌入了另一个字处理文档,题目要求既要对素材文档进行修改,也要对嵌入的文档进行格式调整.打开嵌入的文档对于操作者来说 ...

  3. 在Java中使用xpath对xml解析

     个人博客地址:https://www.vastyun.com xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本, ...

  4. 通过 .NET Framework 中的 XPath 和 XSLT API 方便地操作 XML 数据

    本文假设您熟悉 Visual Basic .NET 下载本文的代码: XPathandXSLT.exe (166KB) 摘要 XPath 是一种正在兴起的通用查询语言.通过 XPath,可以在基于 X ...

  5. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  6. 【项目经验】如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置

    如果想在mapper.xml文件中的一个标签中写多条sql语句,则需要在jdbc的配置文件中稍做配置: url=jdbc:mysql://127.0.0.1:3306/airipo?useUnicod ...

  7. XML解析中的namespace初探

    初学者在解析XML文件的时候最容易遇到的问题恐怕就是XML的namespace了,本文旨在对namespace做一个简要的介绍. namespace的意义无需多说,和C++,C#等高级语言一样,XML ...

  8. python中xpath用法_Python中的xpath基础使用

    前言: XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 含有超过 100 个内建的函数.这些函数用于字符串值.数值.日期和时 ...

  9. XPath语法 在C#中使用XPath例子与用法

    XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml version="1.0" en ...

最新文章

  1. “数据科学家”或许不再性感,但“数据团队”的产业化才刚开始 | 专访领英全球数据科学团队负责人...
  2. Fragment使用小技巧
  3. oracle元数据存储在表空间,[Oracle] dbms_metadata.get_ddl 的使用方法总结
  4. pat天梯赛练习 L2-006
  5. Effective C++ ——让自己习惯C++
  6. 谈谈我们如何发现 VMware vCenter 的越权 RCE
  7. 2016 Multi-University Training Contests
  8. error: ‘nullptr’ was not declared in this scope
  9. VC知识库BLOG-技术,非技术......
  10. 解决NintendoSwitch安装SXPro后开机长期蓝屏问题
  11. 旋转矩阵(Rotate Matrix)的性质分析
  12. Spring中bean的scop
  13. 计算机无法登陆账户 让注销,电脑开机出现登陆账户,点了以后就马上注销,怎么处理?...
  14. matlab中牛顿下山法实例,非线性方程的数值解法牛顿下山法matlab
  15. 美国东北大学计算机专业排名,美国东北大学计算机科学专业解析
  16. Linux设置支持中文
  17. UML在需求分析与系统设计中之实战讲解(完整UML图形演示)
  18. 西南科技大学数据库实验二(Oracle 11g)
  19. python加油代码_python入门教程NO.5 用python写个自动选择加油站的小程序
  20. mysql5.6.37驱动_mysql5.6.37安装

热门文章

  1. LInux初始学习篇:基本命令使用
  2. Post with HttpClient
  3. slice,substr和substring的区别
  4. pptpd的远程连接成功并使用
  5. solrCloud异常
  6. Open Cascade DataExchange DXF
  7. Lync2013 恢复-整残之后如何重新安装
  8. script中用php
  9. C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...
  10. 用字符数组存放一个字符串,然后输出该字符串