两个标签之间的XQuery提取

时间:2010-06-25 13:16:38

标签: xml xquery html-content-extraction

我目前正致力于从HTML中提取数据。我想在两个<p class="xfHeading">标记之间提取文本。

         <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">之间的内容。

2 个答案:

答案 0 :(得分:0)

编辑:在您澄清之后,我的建议是使用FLWOR表达式,例如以下内容。这会根据<p>标记的唯一内容查找包含正确<b>标记内容的<b>,并返回每个<p>标记的文本,该标记是它

for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
    where $b/text() = "XYZ:"
        return p/text()

请注意,//是XPATH构造,而不是注释

OLD ANSWER :如果没有您想要的结果数据的示例,回答这个问题有点困难。但是,要选择<b>标记内的文字,您可以执行以下操作:

/p[class = "xfHeading"]/b/text()

通常,将text()附加到表达式的末尾将返回相关节点内的文本。

答案 1 :(得分:0)

使用

(//p[@class="xfHeading"])[1]
          /following-sibling::p
             [. << (//p[@class="xfHeading"])[2]]
                 /text()

这意味着:选择所有p元素的文本节点子元素,这些元素遵循文档中具有p属性的第一个class元素的兄弟节点值xfHeading,同时位于文档中第二个p元素之前,class属性的值为xfHeading