【问题标题】:Unable to retrieve value using //td[text()=" Ref. :"] in XPATH无法在 XPATH 中使用 //td[text()=" Ref. :"] 检索值
【发布时间】:2011-03-04 12:18:44
【问题描述】:
  <TD colSpan=4> Ref. : XYZ</TD>

我正在尝试使用 XPATH 检索值 XYZ

  //td[text()=" Ref. :"]

但我无法理解...任何人都可以找到错误..

【问题讨论】:

  • 好问题,+1。有关 XPath 表达式问题的解释以及完整、简短和简单的解决方案,请参阅我的答案。 :)

标签: java xpath nsxmlparser


【解决方案1】:

试试

substring-after(//TD[starts-with(text(),' Ref. :')]/text(),' Ref. : ')

结果

XYZ

更新

根据 Alejandro 关于列出几个节点的评论,这里是一个在 Java(标准 JDK Java 解析器)中列出几个 TD 的 Java 示例。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

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

public class TestXPath {

    private static final String FILE = "a.xhtml" ;
    private static final String XPATH = "//td[starts-with(.,'Ref. :')]";
    public static void main(String[] args) {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);
        DocumentBuilder builder;
        try {
            builder = docFactory.newDocumentBuilder();
            Document doc = builder.parse(FILE);
            XPathExpression expr = XPathFactory.newInstance().newXPath().compile(XPATH);
            Object hits = expr.evaluate(doc, XPathConstants.NODESET ) ;
            if ( hits instanceof NodeList ) {
                NodeList list = (NodeList) hits ;
                for (int i = 0; i < list.getLength(); i++ ) {
                    System.out.println( list.item(i).getTextContent().substring( " Ref. :".length() ) );
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

应用于以下测试xhtml文件

<html>
<head>
</head>
<body>
    <table>
        <thead>
            <tr>
                <td>col1</td>
                <td>col2</td>
                <td>col3</td>
                <td>col4</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td colSpan="4">Ref. : Line 1</td>
            </tr>
            <tr>
                <td colSpan="4">Ref. : Line 2</td>
            </tr>
            <tr>
                <td colSpan="4">Ref. : Line 3</td>
            </tr>
            <tr>
                <td colSpan="4">Ref. : Line 4</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

它产生

 Line 1
 Line 2
 Line 3
 Line 4

【讨论】:

  • 不要在混合内容数据模型中使用文本节点作为 XHTML,元素的字符串值是更好的选择。
  • @Alejandro,像这样吗? substring-after(string(//TD[starts-with(.,' Ref. :')]),' Ref. : ') 甚至 substring-after(string(//TD[starts-with(string(.),' Ref. :')]),' Ref. : ') ?
  • 是的,类似于substring-after(//TD[starts-with(.,' Ref. :')],' Ref. : ')。但请注意,隐式转换只会首先选择TD
【解决方案2】:

您可以选择整个文本,然后在 XSLT 中对其进行子串化。

<xsl:value-of 
     select="normalize-space(substring-after(.//html:td/text(), 'Ref. :'))"/>

【讨论】:

  • @Praneel 然后选择整个文本值,然后在 Java 中创建子字符串。我不认为您不能使用 XPath 表达式中的节点值。
【解决方案3】:

&lt;TD colSpan=4&gt; Ref. : XYZ&lt;/TD&gt;

我正在尝试检索值 XYZ 使用 XPATH

//td[text()=" Ref. :"]

但我无法得到...可以 任何人发现错误..

首先是 XPath 表达式的一个主要问题

  //td[text()=" Ref. :"] 

应用于提供的 XML 文档:

  <TD colSpan=4> Ref. : XYZ</TD> 

XPath 是否区分大小写

即使其他所有内容都正确(事实并非如此),使用小写名称的表达式在应用于包含大写名称的 XML 文档时也永远不会选择任何节点。

所以,如果我们纠正这个问题,XPath 表达式变成:

  //TD[text()=" Ref. :"] 

虽然此表达式将选择所提供 XML 文档的顶部(也是唯一的)元素,但它不会产生所需的值。

我将使用的 XPath 是

substring-after(/TD, 'Ref. : ')

或者(知道格式良好的 XML 文档只有一个顶部元素):

substring-after(/*, 'Ref. : ')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多