Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XPath多重查询,基于类和顺序进行解析_Php_Parsing_Xpath - Fatal编程技术网

Php XPath多重查询,基于类和顺序进行解析

Php XPath多重查询,基于类和顺序进行解析,php,parsing,xpath,Php,Parsing,Xpath,当前情况: 我试图用XPath解析DomDocument,结果应该是一个包含类别和子类别的数组。 问题是,制作HTML的人并没有用主类别中的子类别来构造信息,它们只是由纯css分隔 html LOO如下所示: <div class="menu_item">Main Category AC</div> <div class="submenu_div"> <a href="http://www.link.com/313">

当前情况:

我试图用XPath解析DomDocument,结果应该是一个包含类别和子类别的数组。 问题是,制作HTML的人并没有用主类别中的子类别来构造信息,它们只是由纯css分隔

html LOO如下所示:

  <div class="menu_item">Main Category AC</div>

  <div class="submenu_div">

        <a href="http://www.link.com/313">
            <div class="sub_item">
              <h3>Sub Categ A</h3>
            </div>
        </a> 

        <a href="http://www.link.com/475">
            <div class="sub_item">
              <h3>Sub Categ B</h3>
            </div>
        </a>

        <a href="http://www.link.com/321">
            <div class="sub_item">
              <h3>Sub Categ C</h3>
            </div>
        </a>

   </div>

  <div class="menu_item">Main Category BC</div>

  <div class="submenu_div">

        <a href="http://www.link.com/313">
            <div class="sub_item">
              <h3>Sub Categ X</h3>
            </div>
        </a> 

        <a href="http://www.link.com/475">
            <div class="sub_item">
              <h3>Sub Categ Y</h3>
            </div>
        </a>

        <a href="http://www.link.com/321">
            <div class="sub_item">
              <h3>Sub Categ Z</h3>
            </div>
        </a>

   </div>
主要类别AC
主要类别BC
现在,使用这个php我可以提取de类别和子类别,但它只是一个列表,我不知道什么类别中有什么子类别,我被卡住了。 如何使用Xpath提取主类别子类别并为每个子类别分配父类别

    $doc = new DomDocument;
    @$doc->loadHTML($html);    
    $xpath = new DOMXPath($doc);    

    foreach( $xpath->query('//div[@class="menu_item"]|//div[@class="submenu_div"]/a/div/h3') as $e ) {  
      echo $e->nodeValue, "<br />\n";     
    }
$doc=新文档;
@$doc->loadHTML($html);
$xpath=新的DOMXPath($doc);
foreach($xpath->query('//div[@class=“menu_item”]][124;//div[@class=“submenu_div”]]/a/div/h3”)作为$e){
echo$e->nodeValue,“
\n”; }
这是一个使用XPath的解决方案的草图。外部循环查找类别并打印它们。它还跟踪变量
$i
中外部
div
的位置。内部循环构造另一个XPath,选择
$i
'th
div
标记,然后转到下面的同级,最后下降到子类别文本

请注意,您仍然必须将此数据存储到适当的数据结构中。我不熟悉PHP,所以在这方面我帮不了你很多

$i = 0;
foreach( $xpath->query('//div[@class="menu_item"]/text()') as $category ) { 

  $i = $i + 1;
  echo "Category: " . $category->nodeValue . "\n";      
  foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a/div/h3/text()') as $subcategory) {
    echo "  Subcategory: " . $subcategory->nodeValue . "\n";
  }

}

基于上面的答案,我做了一些修改,包括for循环和获取链接:

for ($i = 0; $i <= 25; $i++) {
    foreach( $xpath->query('//div[@class="menu_item"]['.$i.']/text()') as $category ) { 
      echo $i . " Category: " . $category->nodeValue . "<br/>\n";      
      foreach ( $xpath->query('//div[@class="menu_item"][' . $i . ']/following-sibling::div[1][@class="submenu_div"]/a') as $subcategory) {
        echo '-----'. $i . " Subcategory: " . $subcategory->nodeValue . "<br/>\n";
        echo '-----'. $i . " Link: " . $subcategory->getAttribute("href") . "<br/>\n";
      } 

      echo "<br/>";

    }
}
对于($i=0;$i查询('//div[@class=“menu_item”]['.$i.]]/text()')作为$category){
echo$i.“类别:”$Category->nodeValue.“
\n”; foreach($xpath->query('//div[@class=“menu\u item”]['.$i.]]/以下同级::div[1][@class=“submenu\u div”]]/a)作为$subcategory){ 回显'-'.$i.“子类别:“.$Subcategory->nodeValue。”
\n”; 回显'-'.$i.''链接:“.$subcategory->getAttribute(“href”)。”
\n”; } 回声“
”; } }

再次感谢马库斯·里克特

使用上面的代码运行示例:我想使用单个XPath很难做到这一点。你愿意用两个吗?我会用在这一点上有效的任何东西。。也许xpath不是最好的方法,但我会使用任何可以完成任务的方法,因为我的大脑现在正在侧着身子思考这个问题。我在这里,但似乎什么都没有,它还没有完成:(是的!!是的!谢谢!就是这样!