两个标签之间的XQuery提取
问题描述:
我目前正致力于从HTML
提取数据。我想提取两个<p class="xfHeading">
标签之间的文字。两个标签之间的XQuery提取
<p class="xfHeading"><b>XYZ:</b></p>
<p>asdfghjk</p>
<p>sdsdsd</p>
<p>asdvcvcfghjk</p>
<p class="xfHeading"><b>ABC:</b></p>
<P>fvgbhnjm</P>
<p class="xfHeading"><b>PQR:</b></p>
<ul>
</ul>
<p class="xfHeading"><b>MNO:</b></p>
<ul>
<li>jdjshdj</li>
</ul>
的输出应该是:
asdfghjk
sdsdsd
asdvcvcfghjk
做到这一点一种方法是:
/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]
或
/p[class="xfHeading"]/following-sibling::p[position()<4]
然而,由于不断改变我需要,其中,所述两个标签<p class="xfHeading">
之间的内容被提取溶液中的所有的时间之间的内容。
答
使用:
(//p[@class="xfHeading"])[1]
/following-sibling::p
[. << (//p[@class="xfHeading"])[2]]
/text()
这意味着:选择与的xfHeading
具有值class
属性继第一p
元件的兄弟姐妹文档中的所有p
元素的文本节点的孩子,并且同时在文档中的第二p
元素之前,class
属性的值为xfHeading
。
+0
感谢Dimitre它像宝石一样工作。你救了我的脸。 – Technocrat 2010-06-26 15:31:26
答
编辑:经过您的澄清,我的建议是使用FLWOR表达式,如下所示。这会根据<b>
标记的唯一内容查找具有适当<b>
标记内容的<p>
,并返回作为其兄弟的每个<p>
标记的文本。
for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
where $b/text() = "XYZ:"
return p/text()
注意,//
是XPATH结构,不评论
OLD答案:如果没有你想要什么结果数据的样子,回答这个问题的例子是位强硬。然而,要选择,例如,一个<b>
标签里面的文字,你会怎么做:
/p[class = "xfHeading"]/b/text()
一般来说,附加text()
到表达式的结束返回有问题的节点中的文本。
感谢您的澄清!我用一个新建议更新了我的答案。 – nearlymonolith 2010-06-25 15:22:53