【问题标题】:How to handle multiple sub-elements in PHP DOMXPath?如何处理 PHP DOMXPath 中的多个子元素?
【发布时间】:2022-01-23 20:03:32
【问题描述】:

我想使用 PHP 将 HTML 文档导入 MySQL 数据库。

文档的结构如下所示:

<p class="word">
<span class="word-text">word1</span>
<span class="grammatical-type">noun</span>
</p>
...
<p class="word">
<span class="word-text">word128</span>
<span class="grammatical-type">adjective</span>
</p>

对于每个word,我只有一个word-text和一个grammatical-type

我能够找到每个 word 节点,但对于它的每个子节点 word-textgrammatical-type 我会喜欢执行 MySQL 查询:

$dom = new DOMDocument();
            $dom->loadHTMLFile($location);
            $xpath = new DomXPath($dom);
            $res = $xpath->query("//p[@class='word']");
            foreach ($res as $textNode) {
                //do something here for each *word-text*->nodeValue
                //do something here for each *grammatical-type*->nodeValue
                }
            }

我尝试在foreach 循环中将$textNode(这是一个DOMNode)作为$contextNode 传递如下:

$wordText = $xpath->query("span[@class='word-text']", $textNode);
$myWord = $wordText->nodeValue;

但在 $wordText 我只有一个 DOMNodeList 和一个 NULL nodeValue

如何从word节点开始管理子节点?

谢谢

【问题讨论】:

    标签: php html xpath domxpath


    【解决方案1】:

    解决了。

    你只需要,因为你知道node 只包含一个元素,使用item(0) 选择这个单个元素:

    $dom = new DOMDocument();
                $dom->loadHTMLFile($location);
                $xpath = new DomXPath($dom);
                $res = $xpath->query("//p[@class='word']");
                foreach ($res as $textNode) {
                    $wordTextNode = $xpath->query("span[@class='word-text']", $textNode);
                    $word = $wordTextNode->item(0)->nodeValue;
    
                    //do same thing here for each *grammatical-type*
                    }
                }
    

    【讨论】:

      【解决方案2】:

      您可以在 $xpath-&gt;query 调用中提供不同的节点作为上下文:

      <?php
      
      $location = 'so-dom.html';
      $dom = new DOMDocument();
                  $dom->loadHTMLFile($location);
                  $xpath = new DomXPath($dom);
                  $res = $xpath->query("//p[@class='word']");
                  foreach ($res as $textNode) {
                      echo $xpath->query('./a/text()', $textNode)[0]->nodeValue;
                                                      //^^^^^^^^^
                      };
      
      ?>
      

      文档在哪里

      <head></head>
      <body>
        <p class="word"><a>one</a></p>
        <p class="word"><a>two</a></p>
      </body>
      

      将打印“onetwo”

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2011-03-02
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多