0

DomElement オブジェクトをトラバースするためのより適切な/より良い方法はありますか?

特に、値 4、5、および 6 を取得しようとしているときに、ノードを取得するより良い方法があるに違いないと考えてい->nextSibling->nextSibling->nextSibling->nextSiblingます...? 必要な兄弟を指定できる方法はありますか?

public function fire()
{
    $url = "http://test.com";
    $html = $this->downloadPage($url);

    $doc = new DOMDocument();
    @$doc->loadHTML($html);

    $xpath = new DOMXpath($doc);

    $myXpath = $xpath->query('//*[@id="test_table"]');

    if (!is_null($myXpath)) 
    {
        $domElement = $myXpath->item(0);
            $parent = $domElement->firstChild->nextSibling->nextSibling->firstChild->nextSibling;
            $value1 = $parent->nodeValue;
            $value2 = $parent->nextSibling->nodeValue;
            $value3 = $parent->nextSibling->nextSibling->nodeValue;

            $this->info("Value 1: " . $value1);
            $this->info("Value 2: " . $value2);
            $this->info("Value 3: " . $value3);
    }
    else {
        $this->info("Error");
    }
}

テーブルには次の構造があります

<table id="test_table">
    <tr>
        <td width="40"></td> // Dont Want
        <td width="55"></td> // Dont Want
        <td width="55"></td> // Dont Want
        <td width="55"></td> // Dont Want
    </tr>
<!--A comment--> // Dont Want
    <tr>
        <td>AM</td>
        <td class="pricing">aaa</td>  // Value1
        <td class="pricing">bbb</td>  // Value2
        <td class="pricing">ccc</td>  // Value3
    </tr>
    <tr>
        <td>PM</td>
        <td class="pricing">ddd</td>  // Value4
        <td class="pricing">eee</td>  // Value5
        <td class="pricing">fff</td>  // Value6
    </tr>
<!--Updated 10:31 18/10/2013--> // I want this date comment
    <tr>
        <td>&nbsp;</td> // Dont Want
        <td colspan="3" align="right"></td> // Dont Want
    </tr>
</table>
4

1 に答える 1

1

正確に何が必要なのかは完全にはわかりませんが、クラスのセルから値を取得し、コメントpricingも取得したいようです。Updated

// Get the table, to use as a context node for the other queries
$table = $xpath->query('//table[@id="test_table"]')->item(0);

// Get cells with class="pricing"
$pricings = $xpath->query('descendant::td[@class="pricing"]', $table);
foreach ($pricings as $pricing) {
    // E.g. $text = $pricing->nodeValue;
    var_dump($doc->saveXML($pricing));
}

// Get the "Updated ..." comment
$updated_query = 'string(descendant::comment()[starts-with(., "Updated ")])';
$updated = $xpath->evaluate($updated_query, $table);
var_dump($updated);

See this example's output

于 2013-10-18T12:30:55.103 に答える