Xpath falsch?

suntrop

Erfahrenes Mitglied
Hallo liebe XMLer.
Ich treffe gerade zum ersten Mal auf XPath und leider hängt es schon beim "Auslesen" einer Website.
Ich will über ein PHP-Script mittels XPath bestimmte Inhalte im DOM identifizieren. Zum Beispiel den Div mit der ID content. Also schreibe ich:
Code:
//div[contains(@id, "content")]

Aber irgendwie gibt mir das Script (kann ich in der Testausgabe sehen) den kompletten HTML-Code aus. Ist der XPath falsch?
Vielleicht muss ich auch eher am PHP-Script suchen?
 
Danke für den Tipp.
Leider hilft auch das nicht weiter. Ich erhalte aber auch kein geändertes Ergebnis, wenn ich //div oder //h1 eintippe.
Ich befürchte, es liegt am PHP-Tool :(

Gibt es vielleicht ein Tool mit dem Xpath-Angaben testen kann? Ähnlich wie es das für RegEx auch gibt?


Danke und Grüße
suntrop
 
Danke für den Tipp mit dem Editor.
Ich habe den Code (der mir als Preview dienen soll) mal in den Editor reinkopiert und den Xpath-Ausdruck getestet. Fehlanzeige. Auch keine anderen werden gefunden.

Das alles (hier etwas gekürzt) wird mir ausgegeben:
HTML:
<?xml version="1.0" encoding="utf-8"?>
<!-- ra -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<!-- InstanceBegin template="/Templates/abitur.dwt" codeOutsideHTMLIsLocked="false" -->
<head>
<meta name="generator" content="HTML Tidy for Linux/x86 (vers 1 September 2005), see www.w3.org" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="imagetoolbar" content="no" />
<meta http-equiv="content-language" content="de" />
<meta name="robots" content="/robots.txt" />
<!-- InstanceBeginEditable name="doctitle" -->
<title>Titel</title>
<!-- InstanceEndEditable -->
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
<link href="/library/stylesheets/print.css" rel="stylesheet" type="text/css" media="print" />
<!--[if lt IE 7]><link href="/library/stylesheets/ie-fixes.css" rel="stylesheet" type="text/css" media="screen" /><![endif]-->

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js">
</script><!--

        <script type="text/javascript" src="/library/javascripts/functions.js"></script>

        -->

<style type="text/css" media="screen">

                /* <![CDATA[ */

                body {

                        margin: 0;

                        background: #ddd;

                        font-family: Helvetica, Verdana, Arial, sans-serif;

                        font-size: 90%;

                        }



                #navigation a {

                        display: block;

                        width: 160px;

                        height: 45px;

                        }


                /* ]]> */

</style>
<!-- InstanceBeginEditable name="head" -->

<style type="text/css" media="screen">

                /* <![CDATA[ */

                #was { background-position: 0 -50px; }

                /* ]]> */

</style>
<!-- InstanceEndEditable -->
</head>
<body>
<div id="wrapper">
<div id="navigation">...</div>
<!-- end #leftBar -->
<div id="content"><!-- InstanceBeginEditable name="content" -->
<h1>Titel</h1>
<p><strong>Inhaltstext</strong></p>
<p>Du hast...
<p><strong>Text</strong></p>
<!-- InstanceEndEditable --></div>
<!-- end #content --></div>
<!-- end #wrapper -->
<div id="footer">Copyright ....</div>
<!-- end #footer -->

<!-- InstanceEnd -->
</body>
</html>

Und ich gehe mal davon aus, dass dort eigentlich nur der Inhalt des Divs stehen sollte.
Schade, ich glaube dann ist da nichts zu machen. Die Community des CMS (silverstripe) ist leider nicht sonderlich auskunftsfreudig.

Ich überleg mir etwas ... Plan B muss her :)

Danke dir für deine Unterstützung!
 
Hallo,
Schade, ich glaube dann ist da nichts zu machen.
So schnell würde ich nicht aufgeben.
Dein Dokument hat einen Default-Namensraum "xhtml". Das wird durch das xmlns-Attribut im HTML-Wurzelelement festgelegt:
Code:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
Wenn du also beim XPath-Test nach "//xhtml:div" suchst, dann bekommst du auch alle DIV-Elemente nebst Inhalt - entsprechend über "//xhtml:div[@id='content']" dieses eine.
Wenn du das Namensraumattribut aus dem HTML-Tag mal rausnimmst, dann findest du auch über "//div" etwas.

Übrigens ist das o.g. XML nicht wohlgeformt.
Code:
<p>Du hast...
müßte noch ein abschließendes Tag bekommen.
 
Zuletzt bearbeitet:
Das "XMLNS …" steht nicht in meinem Dokument. Das wird in dem Verarbeitungsprozess durch HTML-Tidy hinzugefügt.
Ich habe es auch mal mit //xhtml:div getestet, aber auch hier erhalte ich selbes Ergebnis.

Aufgeben ist auch nicht so meine Sache, aber die Aufwand-Nutzen-Relation beginnt langsam mehr Richtung Aufwand zu schwanken :D
 
Hi.
Das "XMLNS …" steht nicht in meinem Dokument. Das wird in dem Verarbeitungsprozess durch HTML-Tidy hinzugefügt.
Ich habe es auch mal mit //xhtml:div getestet, aber auch hier erhalte ich selbes Ergebnis.
Dieser XPath funktioniert aber nur, wenn der Namensraum-Präfix xhtml auch definiert ist. Das ist in deinem Beispieldokument nicht der Fall, da wird lediglich der Standard-Namensraum auf "http://www.w3.org/1999/xhtml" gesetzt.

Du müßtest entweder auch einen Standardnamensraum für deine XPath Abfragen festlegen oder den xhtml Namensraum-Präfix für das Dokument noch explizit definieren, oder du machst das Ganze unabhängig vom Namensraum:
Code:
//*[name() = 'div' and @id = 'content']
Wenn du allerdings statt des div Inhalts irgendwie das gesamte Dokument ausgegeben bekommst, machst du vermutlich noch irgendetwas anderes falsch was mit dem verwendeten XPath nichts zu tun hat.

Gruß
 
Wenn du allerdings statt des div Inhalts irgendwie das gesamte Dokument ausgegeben bekommst, machst du vermutlich noch irgendetwas anderes falsch was mit dem verwendeten XPath nichts zu tun hat.
Das vermute ich ebenfalls. Das PHP-Tool gibt leider keine weiteren Debugging-Möglichkeit und eine Doku gibt es auch nicht. Entweder kämpfe ich mich noch durch den kompletten Code und versuche da durchzusteigen, oder ... hmm Plan C fällt mir noch nicht ein :)

Danke euch für die Hilfe!

suntrop
 
Zurück