0

私はこのコードを持っています:

$reader = new DOMDocument();
$reader->loadHTML($shell);
$xpath = new DomXPath($reader);
$xpath->registerNamespace('html','http://www.w3.org/1999/xhtml');
$res = $xpath->query('descendant-or-self::*[contains(@class,"content")]');
print_r($res);

$shell は、次の html コードを含む単なる変数です。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <meta http-equiv="Content-Language" content="en-us" />

        <title>Hello World</title>
    </head>

    <body>
        <div class="content">
            Hello World!!
        </div>
    </body>
</html>

xpathクエリが正しい場合:

descendant-or-self::*[contains(@class,"content")]

クラス「コンテンツ」でdivを取得することになっています。ただし、配列を印刷すると、空のオブジェクトが表示されます。

DOMNodeList Object
(
)

これは、クエリが機能しなかったことを意味しますか? クエリは SimpleXML で動作するため、DomXPath クエリ言語は SimpleXML Xpath 言語とは異なりますか?

動作している場合、一致したノードを表示および変更するにはどうすればよいですか?

4

2 に答える 2

2

print_r- DOMNodeList(またはいずれかの DOM クラス) を実行しても、あまり効果がありません。ほとんどの場合、C / Libxml2 レベルで実装されており、PHP にネイティブに公開されていません。私が知る限り、これは機能し、クエリの後にこれを追加して、結果が得られるかどうかを確認します。

foreach($res as $node){
        var_dump($node->ownerDocument->saveXML($node));
}
于 2010-09-22T23:34:25.433 に答える
0

私はあなたがこのようなものを望んでいると思っています:

//*[@class='content']

これにより、クラスのコンテンツを含むタグが取得されます。

任意の div を取得するだけで、少し読みやすくなります。

//div[@class='content']

xpath では、//演算子を使用して、dom の任意のレベルでタグを取得します。それらすべてに一致します。

于 2010-09-22T23:31:51.057 に答える