获取所有节点,直到与XPATH不同的节点

时间:2016-08-22 22:29:18

标签: xml xpath

我使用Xpath使用PHP分析HTML节点。

在类似如下的情况下:

<html>
  <body>
    <div>
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p>
        <span>Span 1</span>
        <p>Parag 3</p>
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p
      <h2>Something</h2>
        <p>Parag 1</p>
        <p>Parag 2</p>
        <span>Span 1</span>
        <p>Parag 3</p>
    </div>
  </body>
</html>

我使用循环浏览这些节点,但我有一个问题,只能获取标题之间的节点。 实际上我想分开每个h2之间的内容。

我尝试过类似的事情:

//h2/following-sibling::*[1 = count(preceding-sibling::h3[1])]

但这并没有奏效。

有人有想法吗?

非常感谢。

日版

修改

抱歉,我的例子不清楚。我试着更好地解释我的问题。

我正在删除一个标签不具有相同标识类别的网页。

$html = '<html>
  <body>
    <div>
      <article id="article1">
        <h2 class="about">Title 1</h2>
          <p>Parag 1.1</p>
          <p>Parag 1.2</p>
          <span>Span 1.1</span>
          <p>Parag 1.3</p>
        <h2 class="ideas">Title 2</h2>
          <p>Parag 1.4</p>
          <p>Parag 1.5</p
        <h2 class="final">Title 3</h2>
          <p>Parag 1.6</p>
          <span>Span 1.2</span>
          <p>Parag 1.7</p>
      </article>
      <article id="article2">
        <h2 class="previously">Title 1</h2>
          <p>Parag 2.1</p>
        <h2 class="about">Title 2</h2>
          <p>Parag 2.2</p>
          <span>Span 2.1</span>
          <p>Parag 2.3</p>
        <h2 class="final">Title 3</h2>
          <p>Parag 2.4</p>
          <span>Span 2.2</span>
      </article>
    </div>
  </body>
</html>'

对于每篇文章(在同一页面内)我只想在h2标签之后获得带有&#34;关于&#34;直到下一个h2标签,无论其类别或内容如何。

为此,我使用PHP脚本:

在下面的脚本中,$ expression是我需要的xpath表达式:

$expression = "./h2[.,'Title 1']/following-sibling::*[1 = count(preceding-sibling::h2[1])]";

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);

$main = $xpath->query("//div/article");

foreach ($main as $article) {

    echo $xpath->query($expression, $article)->nodeValue;
    echo "<br />";

}

目的是仅使用循环显示从一个h2标签到下一个标签的标签。

在我的例子中,我想获得标签:Parag 1.1 / Parag 1.2 / Span 1.1 / Parag 1.3 / Parag 2.2 / Span 2.1 / Parag 2.3

在第1条中:

<p>Parag 1.1</p>
<p>Parag 1.2</p>
<span>Span 1.1</span>
<p>Parag 1.3</p>

还有第2条:

<p>Parag 2.2</p>
<span>Span 2.1</span>
<p>Parag 2.3</p>

我希望它非常清楚。

由于

1 个答案:

答案 0 :(得分:0)

对于此标记,

<html> 
  <body> 
    <div> 
      <h2>A</h2>  
      <p>1</p>  
      <p>2</p>  
      <span>3</span>  
      <p>4</p>  

      <h2>B</h2>  
      <p>5</p>  
      <p>6</p>  

      <h2>C</h2>  
      <p>7</p>  
      <p>8</p>  
      <span>9</span>  
      <p>10</p> 
    </div> 
  </body> 
</html>

此XPath,

//*[preceding-sibling::h2 = 'B' and following-sibling::h2 = 'C']

会选择"B""C"标题之间的标记,

<p>5</p>
<p>6</p>
根据要求

(如果我猜错了 - 问题陈述不清楚)。