_
toggle menu eXmatrikulationsamt.de
online: 369 gäste

PHP DomXPath

die freaks sind gefragt
Themen Layout: [Standard] · Linear · Outline Thema abonnieren | Thema versenden | Thema drucken
post 02 Sep 2010, 16:41
avatar
fuk da hataz
*********

Punkte: 15000
seit: 27.05.2003

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?


--------------------
onkelroman war hier
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 16:53
avatar
eXma Poltergeist
*********

Punkte: 6729
seit: 20.10.2004

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?

Dieser Beitrag wurde von Stormi: 02 Sep 2010, 16:53 bearbeitet


--------------------
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 17:03
avatar
fuk da hataz
*********

Punkte: 15000
seit: 27.05.2003

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)..
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 17:18
avatar
eXma Poltergeist
*********

Punkte: 6729
seit: 20.10.2004

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.
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 19:05
avatar
Voll Laser
*******

Punkte: 1430
seit: 21.08.2008

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)]

Dieser Beitrag wurde von I.I: 02 Sep 2010, 19:07 bearbeitet


--------------------
Verein: USV TU Dresden

--Film Fan--
--Poker Fan--
--Billard Fan--
--Schach Fan--
--Fußball Fan--
--Rennrad Fan--
--Triathlon Fan--
--Volleyball Fan--

--Luiz Bonfa Fan--
--Eliane Elias Fan--
--Scott Joplin Fan--
--The Beatles Fan--
--Woody Allen Fan--
--Bodo Wartke Fan--
--Joao Gilberto Fan--
--Monty Python Fan--
--Volker Pispers Fan--
--Ennio Morricone Fan--
--Alfred Hitchcock Fan--
--Georg Schramm Fan--
--Kool & The Gang Fan--
--Earth, Wind & Fire Fan--

--V for Vendetta Fan--
--Das Leben des Brian Fan--
--Jackie Brown Soundtrack Fan--
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 19:12
avatar
eXma Poltergeist
*********

Punkte: 6729
seit: 20.10.2004

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

ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 19:18
avatar
Voll Laser
*******

Punkte: 1430
seit: 21.08.2008

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.

Dieser Beitrag wurde von I.I: 02 Sep 2010, 19:32 bearbeitet
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 21:39
avatar
eXma Poltergeist
*********

Punkte: 6729
seit: 20.10.2004

Allgemeine Lösungen sind genau dann schlecht, wenn man Spezialfälle behandeln will. Dein Post beantwortet außerdem meine Frage nicht.
ProfilPM
AntwortenZitierenTOP
post 02 Sep 2010, 23:19
avatar
Voll Laser
*******

Punkte: 1430
seit: 21.08.2008

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 ....
ProfilPM
AntwortenZitierenTOP
post 01 Nov 2010, 14:03
avatar
fuk da hataz
*********

Punkte: 15000
seit: 27.05.2003

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..
ProfilPM
AntwortenZitierenTOP
post 01 Nov 2010, 14:11
avatar
Are you afraid?
********

Punkte: 1648
seit: 11.10.2007

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


--------------------
In my talons, I shape clay, crafting life forms as I please.
Around me is a burgeoning empire of steel.
From my throne room, lines of power careen into the skies of Earth.
My whims will become lightning bolts that devastate the mounds of humanity.
Out of the chaos, they will run and whimper, praying for me to end their tedious anarchy.
I am drunk with this vision. God: the title suits me well.
ProfilPM
AntwortenZitierenTOP
post 01 Nov 2010, 14:16
avatar
fuk da hataz
*********

Punkte: 15000
seit: 27.05.2003

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?
ProfilPM
AntwortenZitierenTOP
1 Nutzer liest/lesen dieses Thema (1 Gäste)
0 Mitglieder: