<TD colSpan=4> Ref. : XYZ</TD>
我试图使用XPATH无法使用// TD检索值文本()=“参考:”在XPATH
//td[text()=" Ref. :"]
检索值XYZ,但我无法得到那......任何人都可以找到错误..
<TD colSpan=4> Ref. : XYZ</TD>
我试图使用XPATH无法使用// TD检索值文本()=“参考:”在XPATH
//td[text()=" Ref. :"]
检索值XYZ,但我无法得到那......任何人都可以找到错误..
尝试
substring-after(//TD[starts-with(text(),' Ref. :')]/text(),' Ref. : ')
国债收益率
XYZ
更新
继亚历杭德罗的有关列出几个节点的话,在这里上市是在Java中几个阵(标准JDK Java解析器)的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,元素的字符串值是更好的选择。 – 2011-03-04 14:25:03
@Alejandro,像这样? 'substring-after(string(// TD [starting-with(。,'Ref。:))),'Ref。:')'或甚至'substring-after(string(// TD [starts-with字符串(。),'Ref。:')]),'Ref。:')'? – 2011-03-04 14:32:23
是的,像'substring-after(// TD [starts-with(。,'Ref。:))','Ref。:')''。但请注意,隐式转换只会选择第一个选择的“TD”。 – 2011-03-04 14:45:34
您可以选择整个文本,然后在XSLT串吧。
<xsl:value-of
select="normalize-space(substring-after(.//html:td/text(), 'Ref. :'))"/>
我希望在java中完成.. – 2011-03-04 14:12:12
@Praneel然后选择整个文本值,然后在Java中创建子字符串。我不认为你不能在XPath表达式中使用节点的值。 – 2011-03-04 14:53:58
<TD colSpan=4> Ref. : XYZ</TD>
我试图检索值XYZ 使用XPATH
//td[text()=" Ref. :"]
,但我无法得到那个......能 任何人发现错误..
别的之前,你的XPath表达式的一个重大问题:被应用在提供XML文档
//td[text()=" Ref. :"]
:
<TD colSpan=4> Ref. : XYZ</TD>
是,XPath是大小写敏感的。
即使其他所有东西都是正确的(不是这样),使用小写名称的表达式在应用于包含大写名称的XML文档时决不会选择任何节点。
所以,如果我们解决此问题的XPath表达式变成:
//TD[text()=" Ref. :"]
虽然这种表达会选择顶部(只)提供的XML文档的元素,也不会产生想要的值。
我会使用XPath是:
substring-after(/TD, 'Ref. : ')
或(知道一个良好的XML文档仅具有一个顶部元件):
substring-after(/*, 'Ref. : ')
好问题,1。请参阅我的答案,以解释XPath表达式的问题以及完整,简短和简单的解决方案。 :) – 2011-03-04 18:56:30