php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 3 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 09-11-2011, 22:39
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Unhappy XMLReader: Original Tag ausgeben

Hallo zusammen,

Ich habe mal wieder eine Frage. Und zwar lese ich mit XMLReader ein XHTML-Dokument ein.

Jetzt kommt es teilweise vor, dass ich gerne meine Tags wieder so zurück bekomme wie XMLReader die gelesen hat. Der zerpflückt die ja dann für sich in "Attributes", "LocalName", "Prefix", usw.

Gibt es eine einfache Möglichkeit wie ich wieder den aktuellen Tag zusammengesetzt bekomme vom Reader, so wie er gelesen wurde?

Wenn im Original folgender Tag stand:
Code:
<body id="no-js">
möchte ich wieder per: $xmlReader->{method?}

wieder folgendes bekommen:
Code:
<body id="no-js">
Hab es schon versucht mit expand() und dann das DOMElement irgendwie wieder so zurückzubekommen, aber da hab ich auch nichts gefunden...

Kann mir da jemand weiter helfen ? Wäre echt super .
Mit Zitat antworten
  #2 (permalink)  
Alt 10-11-2011, 07:32
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

wenn du nur ein einzelnes Tag haben willst, kommst du am besten, wenn du es dir selbst wieder zusammenbaust. Wenn du dagegen den XML-Code für ein ganzes Element haben möchtest (öffnendes Tag, Inhalt, schließendes Tag), kannst du die Methode readOuterXML() verwenden.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 10-11-2011, 07:57
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Danke für deine Antwort.

Ja das selbst zusammenbauen habe ich versucht, scheiterte aber daran, dass ich den Namen der Attribute nicht mehr herausfand. Ich kann zwar mit getAttributeNo() ein bestimmtes Attribut ziehen, aber bekomme immer nur den Value zurück und nie den Namen...

Also bei
Code:
<body class="no-js">
Bekomme ich "no-js" zurück. Aber wie komme ich an den Namen "class" ran?
Mit Zitat antworten
  #4 (permalink)  
Alt 10-11-2011, 08:12
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Hmmm...
Warum verwendest du nicht DOM, wenn dir der Reader nicht reicht?
__________________
Wir werden alle sterben
Mit Zitat antworten
  #5 (permalink)  
Alt 10-11-2011, 08:55
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Mit DOM hab ichs auch schon versucht, aber da steh ich auch an. Es handelt sich um folgendes XHTML-File:

HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns:tst="http://www.google.ch/">
	<head>
		<title>Test</title>
	</head>
	<body class="no-js">
		<h1>Newest news</h1>
		<p><tst:text value="info" /></p>
		<tst:for value="foo" var="bar">
			<h2><tst:text value="bar[title]" /></h2>
			<p><tst:text value="bar[content]" /></p>
			<hr />
		</tst:for>
		
		<script type="text/javascript">
			function helloWorld() {
				alert('hello world');
			}
		</script>
	</body>
</html>
Ich versuche das mit folgendem Code mal zu laden:

Code:
$this->domReader = new DOMDocument();
$this->domReader->loadHTMLFile($tplFile);
$this->tplNameSpace = 'tst';
		
var_dump($this->domReader->getElementsByTagNameNS('http://www.google.ch/','tst'));
Aber das wirft den Fehler:

Code:
Notice: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: 
Namespace prefix tst is not defined in template.html, line: 
11 in C:\xampp\htdocs\tagmania\TemplateEngineDOM.class.php on line 13
Mit Zitat antworten
  #6 (permalink)  
Alt 10-11-2011, 09:58
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Die Methode loadHtmlFile() lädt eine HTML-4.0-Datei. Um XHTML zu laden, musst du loadXmlFile() benutzen.

Der zweite Fehler liegt in der Benutzung der getElementsByTagNameNS()-Methode. Die zweite Parameter gibt den localName an, nicht das NS-Präfix. Wenn du alle Elemente in diesem Namespace finden willst, musst du "*" als zweiten Parameter angeben. Wenn du dort z. B. "for" schreibst, findet es alle tst:for-Elemente. Mit "tst" findet es gar nichts, weil es im Dokument kein Element tst:tst gibt.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 10-11-2011, 10:06
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Okay danke . Da hätte ich auch selbstr drauf kommen müssen.

Hab es nun geschafft. Jetzt habe ich mal eine Grundsätzliche Frage: Was eignet sich am besten für folgendes Szenario:

"Ich möchte alles des geladenen (X)HTML-Files normal ausgeben, ausser bei den <tst:*>-Tags muss ich bestimmte Aktionen auslösen die dann neues XML generieren, das dann den <tst:*>-Tag inkl. dessen Inhalt ersetzt."

Beim XMLReader-Ansatz hatte ich das so, dass ich einfach den XmlReader->prefix überprüft habe und wenn der nicht "tst" war hab ich das Element dann normal ausgegeben. Aber z.B. Kommentare im Template-File wurden entkommentiert, ich kann den DOCTYPE nicht mehr ausgeben und weshalb ich schrieb: die Attribute müsste ich mühsam wieder zusammensetzen, usw...

Geändert von pascal007 (10-11-2011 um 10:14 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 10-11-2011, 10:09
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich würde XSL-T benutzen, um das Dokument zu transformieren.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #9 (permalink)  
Alt 10-11-2011, 10:27
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Also das heisst ich würde das HTML-Dokuemnt als XML in ein DOMDocument einlesen. Dann die manipulationen machen (<tst:*>-Tags löschen und dafür das neue, generierte XML einsetzen) und dann das modifizierte XML mit XSLT wieder in ein HTML-Dokument "umstylen"?
Mit Zitat antworten
  #10 (permalink)  
Alt 10-11-2011, 10:33
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Eigentlich meinte ich es anders. Ich gehe einfach mal davon aus, das alles in dem Namespace http://www.google.ch/ irgendwelcher Template-Kram ist, den du dir selbst ausgedacht hast. Wenn das stimmt, hast du versucht, XSL-T selbst nachzubauen, was eigentlich Zeitverschwendung ist. Lösung: Nimm gleich XSL-T als Template-Sprache.

Wenn ich mich irre, erklär bitte einfach mal, woher die Elemente dieses Namespace kommen und wofür sie gut sind.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #11 (permalink)  
Alt 10-11-2011, 10:42
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Ja das scheine ich in dem Fall versucht zu haben. Ziel ist es eine leichte TemplateEngine zu schreiben die mit "Custom Tags" Arbeitet (wie in JSF).

Also die Idee ist, dass man ein normales HTML-File schreibt und Custom-Tags mit einem Namespace kennzeichnet (eben z.B. "tst"). Dann sollen die <tst:*>-Tags durch generierten Inhalt abgelöst werden.

Bei dem For-Tag wird durch ein Array ("foo") durchgelaufen und der Code in dem Tag so oft neu gefüllt und ausgegeben wie das Array Inhalte hat.

Mein For-Tag ist eigentlich folgender PHP-Code:

Code:
<?php

$foo = array(...);

foreach($foo as $bar) {
    echo 'htmlcode hier';
}

?>
Das Problem an XSLT... ich möchte wirklich ganz normales HTML (plus meine Custom Tags mit entsprechendem Namespace) schreiben (ohne xslt-Anweisungen zwischen dem HTML-Code)...
Mit Zitat antworten
  #12 (permalink)  
Alt 10-11-2011, 10:48
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von pascal007 Beitrag anzeigen
Das Problem an XSLT... ich möchte wirklich ganz normales HTML (plus meine Custom Tags mit entsprechendem Namespace) schreiben (ohne xslt-Anweisungen zwischen dem HTML-Code)...
Das schöne an XSLT… du kannst wirklich ganz normales HTML (plus XSLT-Tags mit entsprechendem Namespace) schreiben (denn so wie es jetzt aussieht, sind deine Custom Tags genau die, die XSLT schon eingebaut hat)…

Falls nicht, kannst du deine Templates (HTML + Custom Tags) durch XSLT jagen, ohne das Dokument vorher mit DOM manipulieren zu müssen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #13 (permalink)  
Alt 10-11-2011, 10:56
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Das ist mir jetzt ein bisschen abstrakt, sorry wenn ich da nicht gleich nachkomme.

Also die Idee ist, dass es dann auch noch andere Tags gibt und das man für beliebige Aufgaben Tags schreiben kann (auch solche die XSLT nicht beherrscht).

Weil wenn meine Template-Klasse nun ein öffnendes <tst:*>-Element findet passiert folgendes (noch mit XMLReader):

PHP-Code:
if($this->xmlReader->nodeType == XmlReader::ELEMENT) {
                echo
"open tpl element: ",$this->xmlReader->localName,"\n";
                
                
$tagClassName ucfirst($this->xmlReader->localName) . 'Tag';
                
                if(!
class_exists($tagClassName))
                    throw new 
TemplateEngineException("Der Tag '" $tagClassName "' ist nicht vorhanden");
                
                
$tag = new $tagClassName;
                
                if(!
$this->xmlReader->isEmptyElement)
                    
self::addPendingTag($this->xmlReader->localName);
                
                
$parseBuff .= $tag->replace($this);
                
                continue;
            } 
in folgendem Methode-Call:

Code:
$tag->replace($this);
Kann ich nun schreiben was der Tag machen soll. Ich könnte da auch aufgrund von einer $_SESSION-Variabel bestimmtes HTML-Ausgeben... z.B.:

PHP-Code:
public function replace(TemplateEngine $tplEngine) {
    if(
$_SESSIOM['loggedin']) {
        return 
'';
    } else {
        return 
'<form method="post" action="?login">
            Username: <input type="text" value="" name="username" />
            Password: <input type="password" value="" name="password" />
            <input type="submit" value="Anmelden" />
        </form>'
;
    }


Geändert von pascal007 (10-11-2011 um 11:04 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 10-11-2011, 11:05
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Ich hab nichts dagegen, dass du das mit PHP machen willst. Ich wollte dir nur vermitteln, dass XSL-T das auch alles kann.

Manche Dinge (z. B. Stringoperationen) sind mit XSLT alleine ziemlich umständlich, das geb ich zu. Dafür kann man aber PHP-Funktionen bzw. -Methoden registrieren und aufrufen (XsltProcessor::registerPhpFunctions()).

Vermutlich sind deine XSLT-Kenntnisse noch nicht so umfangreich und du willst dich mit PHP lieber auf sicherem Terrain bewegen. Das ist völlig in Ordnung. Trotzdem lohnt es sich, einen genaueren Blick auf XSLT zu werfen, denn ich habe den Eindruck, dass du gerade dabei bist, dieses Rad neu zu erfinden, was dich später vielleicht mal ärgern könnte. Ich spreche da aus eigener Erfahrung.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #15 (permalink)  
Alt 10-11-2011, 11:18
pascal007
 Registrierter Benutzer
Links : Onlinestatus : pascal007 ist offline
Registriert seit: Jul 2006
Beiträge: 257
pascal007 ist zur Zeit noch ein unbeschriebenes Blatt
pascal007 eine Nachricht über ICQ schicken
Standard

Ja das ist super :-). Du hast recht.... meine XSLT-Kenntnisse sind nahe 0 (nur mal kurz im Unterricht angeschnitten) ;-).

Aber ich werde das Gefühl nicht los, dass es mit XSLT komplizierter wird als wenn ich das selbst in PHP versuche zu schreiben und ich seh das dann einfach als Übung :-).

Aber eben: Was mach ich jetzt? Ich möchte einfach meine Custom-Tags durch das (X)HTML ersetzen das die "replace()"-Methode von dene generiert und rest des HTML-Dokuments 1:1 ausgeben... aber wie?

(Wenn du Zeit hast und meine Situation in einem kurzen abstrakten XSLT-PHP-Beispiel erläutern könntest, würde ich evtl. auch noch auf den XSLT-Geschmack kommen ;-)).

Geändert von pascal007 (10-11-2011 um 11:22 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bestimmtes Datum (heutiger tag - 5tage) ausgeben? Chriss23 PHP Developer Forum 11 05-04-2007 19:53
Werbecode jedem zweiten Besucher am Tag ausgeben? Mimmi Projekthilfe 4 10-11-2005 18:47
DS pro Tag,Monat u. Jahr ausgeben Csab SQL / Datenbanken 27 05-03-2004 10:58
newsscript, datum nur 1x pro tag ausgeben ? burzum PHP Developer Forum 3 03-06-2003 19:38
datum wie folgt ausgeben: tag dd. monat yyyy bastian PHP Developer Forum 1 25-05-2002 16:33

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:32 Uhr.