2010-07-08 98 views
1

编辑:这是为什么这个投票下来?我真的不知道...顺便说一句../不起作用,因为我不想要表的父母,但实际上想../td+1我不知道这是甚至可能吗?[xpath]需要帮助获取另一个表格行的xpath

嗨,大家好。

我手边有一个相当复杂的问题..

我有这样的一个表:

名称|结果|自动测试|自动测试结果| AutotestName

X |通过| X86HZS1 | | |

所以...我想要做的是以下几点。我只知道身份证。我想从自动测试中更新AutotestResult。首先是空的。

我试图找到ID ...我有。但是当我有ID时,我必须更新它旁边的行。我怎么做?我试着玩xPath。使用../../../td etcetc后退,但没有运气。

我似乎无法找到它的邻居表...

可能有人请点我到正确的方向?

非常感谢您的帮助!

汉尼拔

回答

1

除了jassofollowing-sibling轴的良好建议,这个答案还有一些问题:您必须修复td是什么AutotestID。

所以,知道表”的架构:

<table> 
    <tr> 
    <td>Name</td> 
    <td>Result</td> 
    <td>AutotestID</td> 
    <td>AutotestResult</td> 
    <td>AutotestName</td> 
    </tr> 
    <tr> 
    <td>X</td> 
    <td>Pass</td> 
    <td>X86HZS1</td> 
    <td></td> 
    <td></td> 
    </tr> 
</table> 

你可以使用:

/table/tr/td[3][.='X86HZS1']/following-sibling::td[1] 

如果你不知道AutotestID位置,你可以用途:

/table/tr/td[count(../../tr/td[.='AutotestID']/preceding-sibling::td)+1] 
      [.='X86HZS1']/following-sibling::td[1] 
1

你的问题还不清楚,但我做了一些猜测和假设你有一个XHTML文件

<table> 
    <tr> 
    <td>Name</td> 
    <td>Result</td> 
    <td>AutotestID</td> 
    <td>AutotestResult</td> 
    <td>AutotestName</td> 
    </tr> 
    <tr> 
    <td>X</td> 
    <td>Pass</td> 
    <td>X86HZS1</td> 
    <td></td> 
    <td></td> 
    </tr> 
</table> 

和你正在试图创建后,选择下一个<td>元素的XPath表达式包含文本“X86HZS1”(自动测试标识)的文件。要查找具有特定文本内容的节点,可以使用轴following-sibling以文档顺序显示的谓词和出现在该节点之后的同胞元素。一个适当的XPath表达式将

//td[.='X86HZS1']/following-sibling::td[1] 

如果您匹配相同AutotestID多次出现的表中的数据,该表达式匹配所有这些,将返回集而不是单个节点的节点。

编辑:通常在不需要时不建议使用//,因为它需要遍历整个文档。使用更直接的路径(如评论中提到的)会产生更高效的XPath表达式。

+0

很好的答案。但不建议在不需要时启动'//'运算符。你应该使用:'/ table/td [。='X86HZS1']/following-sibling :: td [1]' – 2010-08-30 14:34:45

+0

是的,我知道'//'很慢并且经常可以避免。这一次我只是用它,因为XML文档的整个结构是我的猜测,我不知道OP将处理什么样的树。不过,你有一个好点,我可能还是应该强调,用更精确的匹配来替换'//'会更好。 – jasso 2010-08-30 14:43:10