2012-02-20 12 views
1

DOMDocumentノードのループ内で特定のクラス名(クラス名= 'foo'を持つdiv)で子ノードを検索しようとしています。それが存在する場合には、1に私のFOO値を設定する必要があります。クラス名による子のXPath/Domdocumentチェック

マイHTMLの$文書は次のようになります。

... 
<div class="posts">Div Posts 1</div> 
<div class="posts">Div Posts 2<div class="foo"></div></div> 
<div class="posts">Div Posts 3</div> 
<div class="posts">Div Posts 4<div class="foo"></div></div> 
<div class="posts">Div Posts 5</div> 
... 

のDOMDocument/Xpathの($文書):

$html = array(); 
$document = new \DOMDocument(); 
$document->loadHTMLFile($url); // loads html from above 
$xpath = new \DOMXPath($document); 

$i=0; 
foreach ($xpath->query(Parser::cssToXpath('.posts')) as $node) { 
    $html['posts'][$i]['content'] = $node->nodeValue; 
    // check if child node with class name 'foo' exists => doesn't work :(
    $children = $node->getElementsByTagName('foo'); 
    if($children) 
     $html['posts'][$i]['foo'] = '1'; 
    else 
     $html['posts'][$i]['foo'] = '0'; 
    $i++; 
} 

出力:

[posts] => Array 
    (
     [0] => Array 
      (
       [content] => Div class Posts 1 
       [foo] => 1 
      ) 

     [1] => Array 
      (
       [content] => Div class Posts 2 
       [foo] => 1 
      ) 

     [2] => Array 
      (
       [content] => Div class Posts 3 
       [foo] => 1 
      ) 

     [3] => Array 
      (
       [content] => Div class Posts 4 
       [foo] => 1 
      ) 

     [4] => Array 
      (
       [content] => Div class Posts 5 
       [foo] => 1 
      ) 

    ) 

getElementsByTagName()は正しいメソッドではないかもしれませんが、すでに別のメソッドを試してみましたが、t彼は右のものです。 :(

答えて

1

をあなたのコメント

フムによるとイエスが、まだdoesnの最終的に私はその親の内容を分析する必要があり、後でそれを置き換える必要があるので、どの.posts divに子要素 'foo'があるかを知る必要があります
前の回答にあなたの述語は、おそらくです:

a)に属性クラスと選択div要素
B)=ポスト
C)とクラス属性を持っている子要素のdiv
D)= fooの

とXPath式として

A)// DIV
B)// DIV
C)//のdiv [@クラス= "ポスト" とDIV]
D [クラス= "ポスト" @]) // d iv [@ class = "posts"とdiv [@ class = "foo"]]

<?php 
$doc = new DOMDocument; 
$doc->loadhtml(getData()); 
$xpath = new DOMXPath($doc); 

/* 
use something like 
    //div[contains(concat(' ',normalize-space(@class),' '),' post ')] 
if the html element may have class="post lalala" 
*/ 
foreach($xpath->query('//div[@class="posts" and div[@class="foo"]]') as $post) { 
    while ($post->firstChild) { 
     $post->removeChild($post->firstChild); 
    } 
    $post->appendChild($doc->createElement('span', 'The quick fox....')); 
} 
echo $doc->savehtml(); 


function getData() { 
    return <<< eoh 
<html><head><title>...</title></head><body> 
    <div class="posts">Div Posts 1</div> 
    <div class="posts">Div Posts 2<div class="foo"></div></div> 
    <div class="posts">Div Posts 3</div> 
    <div class="posts">Div Posts 4<div class="foo"></div></div> 
    <div class="posts">Div Posts 5</div> 
</body></html> 
eoh; 
} 

プリント

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><head><title>...</title></head><body> 
    <div class="posts">Div Posts 1</div> 
    <div class="posts"><span>The quick fox....</span></div> 
    <div class="posts">Div Posts 3</div> 
    <div class="posts"><span>The quick fox....</span></div> 
    <div class="posts">Div Posts 5</div> 
</body></html> 
+0

VolkerKありがとう!それは私を通過するには時間がかかりましたが、それは魅力的な作品です! :-) どうもありがとう! – Mike

+0

こんにちはVolkerK、置き換えられた要素がどの位置にあるのかわかりますか?例えばどのn番目。DOMツリーの要素にchild()またはeq()が含まれていますか? like(pseudo)$ post-> appendChild ..(... 'クイックキツネ...'); $ post-> GetNthChildorEqNr#()... //私に2を与え、4 – Mike

+0

"// 2と4を与えるだろう" - 申し訳ありませんが、あなたは私をそこに失ってしまいました... – VolkerK

1

使用このXPathは、より具体的には、クラスfoo

//div[@class = 'foo'] 

を持つすべてのdivの要素を見つけるために、これを使用します。

//div[@class = 'posts']/div[@class = 'foo'] 
+0

こんにちはキリル、あなたが答えてくれてありがとう。しかし、私は 'foo' divが親ノード内に存在するかどうかを調べることができます。クラスfooを持つdiv要素をすべて取得するのではなく、あなたはそれをする方法を知っていますか? – Mike

+0

@Mike、2番目のクエリを使用できます。クラス 'post'の' div'の中にある場合にのみクラス 'foo'を持つ' div'をすべて返します。 –

+0

はい、残念ながらまだ動作しません。最終的に、私はその親の内容を解析する必要があり、後でそれをjqueryスクリプト$( "posts:eq(1)> .fooで置き換える必要があるので、どの.posts divに子要素 'foo' ").html()。 2番目のクエリは、私のすべてのdivクラスを 'foo'という名前にし、その位置は与えません。分かりますか? – Mike

関連する問題