1

私はそれをこのようにやっています:

$dom = new DOMDocument;
$dom->loadHTMLFile("test.html");
//$books = $dom->getElementsByTagName('body');

$i = 0;
while (is_object($finance = $dom->getElementsByTagName("body")->item($i))) {
    foreach ($finance->childNodes as $nodename) {
        if ($nodename->childNodes) {
            foreach ($nodename->childNodes as $subNodes) {
                if ($subNodes->childNodes) {
                    foreach ($subNodes->childNodes as $potha){
                        echo $potha->nodeName . " - " . $potha->nodeValue . "<br>";
                    }
                } else {
                    echo $subNodes->nodeName . " - " . $subNodes->nodeValue . "<br>";
                }
            }
        } else {
            echo $nodename->nodeName . " - " . $nodename->nodeValue . "<br>";
        }
    }
    $i++;
}

しかし、どうすれば再帰的にできるので、subChildがあるたびに、各子、サブ子、サブ子などをループする必要があります。それ以外の場合は、ノードの名前と値をエコーし​​ます。

また、bodyまたはhtmlに対する各ノードの位置を取得して、各セグメント間に違いがあるようにするにはどうすればよいですか。

4

1 に答える 1

3

このようなものがあなたのために働くはずです:

function treatNode($node)
{
    if ($node->hasChildNodes()) {
        foreach ($node->childNodes as $child){
            treatNode($child);
        }
    } else {
        echo $node->nodeName . " - " . $node->nodeValue . "<br>";
    }
}

$dom = new DOMDocument;
$dom->loadHTMLFile("test.html");
//$books = $dom->getElementsByTagName('body');

$i = 0;
while (is_object($finance = $dom->getElementsByTagName("body")->item($i))) {
    treatNode($finance);
    $i++;
}
于 2012-12-12T09:32:03.207 に答える