eXma » Diskutieren » Computer und Technik
Startseite - Veranstaltungen - Mitglieder - Suche
Vollständige Version anzeigen: PHP DomXPath
onkelroman
gegeben ist folgende datei "test.html"

CODE
<html>
<body>

<div id='a'>
    AAA1 <img src="bild1.jpg">
</div>

<div id='a'>
    <div id='b'>
         BBB1 <img src="bild2.jpg">
    </div>
    AAA2 <img src="bild3.jpg">
</div>

<div id='a'>
    AAA3
</div>

</body>
</html>


ich will NUR die inhalte aus den divs mit der id=a herausfiltern, inklusive der dazugehörigen bilder. ich habe dafür eine php-datei, die folgendermaßen aussieht:

CODE
<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('test.html');

$xpath = new DOMXPath($dom);

$ergebnisse = $xpath->query("//div[@id='a']");

foreach ($ergebnisse as $ergebnis) {
    echo $ergebnis->nodeValue ."<br>";
    }
?>



das ergebnis soll so aussehen:

AAA1 bild1.jpg
AAA2 bild3.jpg
AAA3


sieht aber so aus:

AAA1
BBB1
AAA2
AAA3




basic problem:

ich bekomme als resultat AUCH die text-inhalte der b-divs, will aber NUR die der a-divs ohne kinder!

advanced problem:

die bilder werden nicht mit ausgegeben. das ginge mit
CODE
echo '<img src="'.$ergebnis->getAttribute('src').'" border="0">';

einzeln, soll aber zusammen passieren. ich will ja die texte der a-divs und dahinter sofort das entsprechende bild.


hat da jemand vielleicht einen guten tip?
Stormi
Ich kenne deine API nicht, aber offensichtlich gibt dir ergebnis->nodeValue nicht das Benötigte zurück. Gibt es keine Möglichkeit zwischen dem Textinhalt (alles was keine weitere Node ist), Siblings und Children zu unterscheiden bzw. alle Kindelemente des Ergebnisses durchzuiterieren?

Theoretisch würde ich sowas versuchen:

CODE
echoStuff = ""

for ergebnis->kramderdadrinis : kram
 if kram is text
   echoStuff += kram
 else if kram is childrenNode && kram.type is img
   echoStuff += kram

echo kram


Fahstehste?
onkelroman
ja, man kann mit hasChildNodes() abfragen, ob nachfolger vorhanden sind. aber ich glaube, an der stelle ists schon zu spät, weil die ergebnisse schon berechnet wurden.

ich glaube, das problem liegt eher bei dem query("//div[@id='a']"), das eben a-divs zusammen mit den b-divs herausfiltert (weil die b-divs ja in den a-divs enthalten sind)..
Stormi
Ich bilde mir ein, dass XPath 1.0 nicht mächtig genug ist, um "lass das Element so und so mal aus dem Ergebnis raus" zu spezifizieren.
Du könntest aber den umgekehrten Fall ausdrücken und zumindest mit //div[@id='a']/img schonmal nur die img Tags selektieren. Das geht auch irgendwie (jaja) mit dem Textinhalt der Node. Kann das Ding XPath 2.0? Dann könnten dir die Sequenzfunktionen vielleicht helfen.
I.I
So gehts:

Idee: nehme alle nodes die unter einem div node mit id='a' liegen und davon nur welche die keine id haben. Die Bedingungen kannst du dir ja anpassen.

//div[@id='a']/node()[not(@id)]
Stormi
Ginge auch //div[@id='a']/node()[not(@id='b')]? Ansonsten taugt die Lösung nicht allzuviel.

I.I
Zitat(Stormi @ 02 Sep 2010, 19:12)
Ginge auch //div[@id='a']/node()[not(@id='b')]? Ansonsten taugt die Lösung nicht allzuviel.
*


? Klar taugt die, für sein Beispiel oben (außerdem ist meine Lösung allgemeiner, weil sie auch andere divs mit id weglässt). Hab geschrieben er kann sich die Bedingungen anpassen wie er will. Du bist ja anscheind nicht mal zu einer Lösung gekommen.
Stormi
Allgemeine Lösungen sind genau dann schlecht, wenn man Spezialfälle behandeln will. Dein Post beantwortet außerdem meine Frage nicht.
I.I
Zitat(Stormi @ 02 Sep 2010, 21:39)
Allgemeine Lösungen sind genau dann schlecht, wenn man Spezialfälle behandeln will. Dein Post beantwortet außerdem meine Frage nicht.
*


ja das geht auch ....
onkelroman
ich verzweifel hier grad. schaut euch das an, ich hab folgenden code:

CODE
<?php

$dom = new DOMDocument();           // DOM-Dokument erstellen
@$dom->loadHTMLFile('http://www.exmatrikulationsamt.de/index.php?showtopic=3726&st=15');
$xpath = new DOMXPath($dom);

foreach($xpath->query("//div[@class='postcolor']") as $node)
{
$inhalt = $dom->saveXml($node);
echo $inhalt.'<br /><br />===========<br /><br />';
}

?>


der untersucht folgende seite: [klick]
und soll da jetzt NUR die posts rausfiltern (div class="postcolor").

aber was passiert? sobald ein post ein zitat enthält, zählt es zuerst den post mit zitat und dann nochmal das zitat einzeln!!! HIER klicken, um das resultat zu sehen.

wer weiß rat? ich eskalier gleich..
mmarx
Zitat(onkelroman @ 01 Nov 2010, 13:03)
ich eskalier gleich..
*


Zum Vergrößern klicken:
Zum Vergrößern klicken
Link zum Bild in voller Größe
onkelroman
ach.. ich hab den fehler. posts stehen innerhalb eines <div class="postcolor">-tags, und quotes innerhalb eines <div class='postcolor'>-tags (man beachte den unterschied!) trotzdem (oder besser: gerade deswegen) werden beide rausgefiltert. mist!

weiß zufällig jemand, wie man die xpath-anweisung so verändert, dass der nur die divs mit class="postcolor" rausfindet, aber die mit class='postcolor' nicht?