【问题标题】:Java and xpath - xHtml parsing problemJava 和 xpath - xHtml 解析问题
【发布时间】:2009-07-29 21:58:43
【问题描述】:

我正在尝试解析格式良好的 xhtml 文档。
我在节点迭代期间遇到问题。
我的 xHtml 的结构类似于

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head>...</head>
  <body>
   ...
    <form>
    ...
      <div class="AB">    (1 or 2 times)
      ...                       
        <div class="CD">  
        ...
          <table>          
             <tbody>
                <tr>    (1 to N times)
                   <td> XXX </td>
                       <td> YYY </td> ...

我需要的信息包含在列 (td) 中。
我想构造 N 个对象。因此,每一行 (tr) 在其列中都包含构造对象所需的信息。
我有 class="AB" 的 1 或 2 个 div。所以基本上我会有 1 或 2 个对象 AB,其中包含从表中的每一行创建的其他对象的列表

所以首先我提取了这些 AB div 的 NodeList

NodeList ABlist= (NodeList) xpath.evaluate("//div[@class='AB']", document, XPathConstants.NODESET)

现在我正在尝试获取第一个 div AB 的所有 tr elem 的 NodeList。

NodeList trList = (NodeList) xpath.evaluate("/div/table//tr", ABlist.item(0), XPathConstants.NODESET);

在这种情况下,trList 是空的。你知道我的代码有什么问题吗?
谢谢

【问题讨论】:

    标签: java xml xhtml xpath


    【解决方案1】:

    第二个失败的 XPath 中的问题是您以 / 开头:

    /div/table//tr
    

    在 XPath 中,就像在文件路径中一样,以 / 开头的路径意味着“从文档的根目录开始”。但是您实际上并不想在那里这样做 - 您想从您的节点开始。所以:

    div/table//tr
    

    会做你想做的。

    【讨论】:

    • 你是对的,帕维尔!我认为(作为第二个参数)我将“上下文”传递给评估()方法。我想我在发帖之前没有尝试过 / 但也许我同时也更改了其他内容,但当时并没有奏效。无论如何,它现在正在工作。非常感谢您的帮助!
    • 正在在那里传递上下文。问题是,通过在查询中使用前导 /,您告诉它不是从上下文节点开始路径,而是从节点所属文档的 root 开始。跨度>
    【解决方案2】:

    你确定这是 XHTML 吗?在您的示例文档中没有声明命名空间,如果没有该命名空间,它就不是 XHTML。如果有一个命名空间,而您为了简洁而在示例中遗漏了它,那么您的 XPath 表达式也需要引用该命名空间,否则它们将不会选择任何内容。

    【讨论】:

    • 嗨 skaffman,我正确地检索了 div 的 ABlist。这只是我尝试提取不起作用的 trList 的方式。实际上你是对的,文档没有指定任何命名空间,所以它可能只能称为 xml。它只符合 xml 规范,没有指定任何命名空间。
    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2010-11-11
    • 2013-02-20
    相关资源
    最近更新 更多