无法使用XPATH中的// td [text()=“Ref。:”]检索值

时间:2011-03-04 12:18:45

标签: java xpath nsxmlparser

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

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

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

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

3 个答案:

答案 0 :(得分:1)

尝试

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

产生

XYZ

<强>更新

在Alejandro关于列出几个节点的评论之后,这里是一个用Java列出几个TD的Java示例(标准JDK 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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

  

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

     

我正在尝试检索值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. : ')