PHP DomDocument link tags sind leer – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PHP DomDocument link tags sind leer Fri, 09 Apr 21 08:44:45 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787063#m1787063 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787063#m1787063 <p>Moin,</p> <p>hab hier einen xml:</p> <pre><code class="block"> <stichwort nid="1"> <titel>Abberufbarkeit</titel> <text>A. bezeichnet das <link nid="1226">Recht</link> einer Wählerschaft, gewählte Mitglieder der <link nid="872">Legislative</link>, <link nid="509">Exekutive</link> oder <link nid="746">Judikative</link> vor Ablauf ihrer <link nid="61">Amtsperiode</link> abzuwählen oder abzuberufen. A. ist bspw. in den <link nid="1537">Verfassungen</link> verschiedener US-amerikanischer Einzelstaaten vorgesehen. </text> </stichwort> </code></pre> <p>Das steht in einer Datei. Diese lade ich in ein DomDocument Objekt und versuche die links raus zu filtern:</p> <pre><code class="block"> $strContent = file_get_contents( $strFile ); $objDom = new DomDocument(); @$objDom->loadHTML( $strContent ); $arLinks = $objDom->getElementsByTagName('link'); </code></pre> <p>Jedoch sind alle Links leer:</p> <pre><code class="block">echo $arLinks[0]->C14N() </code></pre> <p>Ersetze ich jedoch alle links mit kinl, dann funktioniert es:</p> <pre><code class="block"> $strContent = file_get_contents( $strFile ); $strContent = str_replace("<link","<kinl", $strContent); $strContent = str_replace("</link>","</kinl>", $strContent); $objDom = new DomDocument(); @$objDom->loadHTML( $strContent ); $arLinks = $objDom->getElementsByTagName('kinl'); echo $arLinks[0]->C14N() //--- Recht </code></pre> <p>Ich hab keine Ahnung wieso...</p> <p>Gruße xeR-T</p> PHP DomDocument link tags sind leer Fri, 09 Apr 21 09:13:22 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787066#m1787066 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787066#m1787066 <p>Hallo T-Rex,</p> <pre><code class="block bad language-php">@<span class="token variable">$objDom</span><span class="token operator">-></span><span class="token function">loadHTML</span><span class="token punctuation">(</span> <span class="token variable">$strContent</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>diese Zeile ist schuld. Doppelt!</p> <p>Fehler 1: Das @ versteckt den Fehler 2 vor Dir. Nimm es weg und betrachte die diversen Fehlermeldungen, die dann erscheinen. Die sollten Dich vom Holzweg auf eine gute, sichere Straße bringen. Vergleiche auch mal die Meldungen mit denen, die kommen, wenn Du link durch knil oder sowas ersetzt.</p> <p>Fehler 2: Na? Wer weiß denn sowas? Ist es<br> (A) die fehlende Zuweisung des Rückgabewertes an $objDom<br> (B) die falsche Methode zum Laden des Dokuments<br> (C) die fehlende LIBXML_NOXMLDECL Option (als 2. Parameter der Lademethode)?</p> <p>Im Übrigen:</p> <pre><code class="block bad language-php"><span class="token keyword">echo</span> <span class="token variable">$arLinks</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token function">C14N</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//--- Recht</span> </code></pre> <p><strong>Parse error</strong>: syntax error, unexpected end of file<br> <strong>Wrong result</strong>: Da kommt nicht nur "Recht" heraus.</p> <pre><code class="block good language-php"><span class="token keyword">echo</span> <span class="token variable">$arLinks</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">textContent</span><span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token comment">//--- Recht</span> </code></pre> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> PHP DomDocument link tags sind leer Fri, 09 Apr 21 09:42:48 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787074#m1787074 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787074#m1787074 <blockquote> <p>Ich hab keine Ahnung wieso...</p> </blockquote> <p>das link-Element in html kennt kein Attribut nid. Vielleicht ignoriert die loadHTML-Methode deshalb das link-Element</p> <p>Das kinl-Element hat im html-Kontext keine Bedeutung. Vielleicht akszeptiert die loadHTML-Methode deshalb das kinl-Element.</p> <p>P.S.</p> <p>Wie es aussieht, ist mit dem link-Elemnet im XML-Dokement nicht das link-Element im html-Kontext gemeint, sondern ein a-Element</p> PHP DomDocument link tags sind leer Fri, 09 Apr 21 09:43:03 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787075#m1787075 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787075#m1787075 <p>Hallo,</p> <p>Vermutung: der Objekttyp ist dem Parser unbekannt?</p> <p>Da hilft manchmal eine vorgeschaltete Zeile mit dem passenden Objekttyp aka Dokumenttyp.</p> <p>LG<br> Ralf</p> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:10:17 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787082#m1787082 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787082#m1787082 <p>Hello,</p> <blockquote> <pre><code class="block"> $strContent = file_get_contents( $strFile ); $objDom = new DomDocument(); @$objDom->loadHTML( $strContent ); $arLinks = $objDom->getElementsByTagName('link'); </code></pre> </blockquote> <p>In meinen Parser-Applikationen habe ich immer stehen:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">get_linklist</span><span class="token punctuation">(</span><span class="token variable">$page</span><span class="token punctuation">,</span> <span class="token operator">&</span><span class="token variable">$_exceptions</span> <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$dom</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DOMDocument</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'1.0'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token property">encoding</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'utf-8'</span><span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token property">validateOnParse</span> <span class="token operator">=</span> <span class="token constant boolean">TRUE</span><span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token property">strictErrorChecking</span> <span class="token operator">=</span> <span class="token constant boolean">true</span> <span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token property">preserveWhiteSpace</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token property">resolveExternals</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token function">set_error_handler</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'handleError'</span><span class="token punctuation">,</span> <span class="token constant">E_WARNING</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token function">loadHTML</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'<meta http-equiv="content-type" content="text/html; charset=utf-8">'</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\r\n"</span> <span class="token operator">.</span> <span class="token variable">$page</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">restore_error_handler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$a_nodelist</span> <span class="token operator">=</span> <span class="token variable">$dom</span><span class="token operator">-></span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">## ... </span> </code></pre> <p>In <code>$page</code> ist die Seite als String drin.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:46:03 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787095#m1787095 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787095#m1787095 <p>Lieber T-Rex,</p> <blockquote> <p>hab hier einen xml: [...] @$objDom->loadHTML( $strContent );</p> </blockquote> <p>da hätte ich jetzt eine andere Methode erwartet, nämlich <a href="https://www.php.net/manual/de/domdocument.loadxml.php" rel="nofollow noopener noreferrer">loadXML</a>. In HTML haben <code><link></code>-Elemente nämlich keinen Inhalt, weil sie dort so definiert sind.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> PHP DomDocument link tags sind leer Fri, 09 Apr 21 09:34:28 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787072#m1787072 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787072#m1787072 <p>$objDom->loadXML( $strContent, LIBXML_NOXMLDECL );</p> <p>Das verhalten bleibt das gleiche. Die link Tags werden leer ausgegeben.</p> <p>Gruß leerer T-Rex</p> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:16:04 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787083#m1787083 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787083#m1787083 <p>Hallo T-Rex,</p> <p>nur eine der drei Antworten war richtig: B . Die Option LIBXML_NOXMLDECL bezieht sich auf das Speichern eines Dokuments als String.</p> <p>Ich bin ratlos, mit loadXML funktioniert es bei mir. Mit PHP Versionen 5.6 bis 8. Sind bei Dir noch andere Rahmenbedingungen?</p> <p><a href="https://sandbox.onlinephpfunctions.com/code/5a5d37e14ea73a1723df12dea9bf5458946ed8cd" rel="nofollow noopener noreferrer">https://sandbox.onlinephpfunctions.com/code/5a5d37e14ea73a1723df12dea9bf5458946ed8cd</a></p> <p>Dass ich DOMDocument statt DomDocument geschrieben habe, ist egal. Das ist in PHP nicht case-sensitive.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:26:50 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787089#m1787089 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787089#m1787089 <p>Hallo TS,</p> <p>sicherlich sinnvolle Optionen, aber ich würde gern wissen, ob ich die richtig verstanden habe.</p> <blockquote> <p><em>resolveExternals</em><br> Set it to true to load external entities from a doctype declaration. This is useful for including character entities in your XML document.</p> </blockquote> <blockquote> <p><em>strictErrorChecking</em><br> Throws DOMException on errors. Default to true.</p> </blockquote> <blockquote> <p><em>validateOnParse</em><br> Loads and validates against the DTD. Default to false.</p> </blockquote> <p>resolveExternals scheint mir für HTML irrelevant. Bei XML nicht, aber T-Rexens XML Fragment enthält sowas nicht.</p> <p>strictErrorChecking setzt einen try-catch Block voraus, sonst fliegst Du bei Fehlern komplett aus dem Script. Hast Du den außerhalb deiner Funktion?</p> <p>validateOnParse setzt voraus, dass eine DTD da ist. Soweit ich weiß, gibt es für HTML 5 keine DTD mehr, aber für HTML 4 gab's noch eine. Das setzt dann einen entsprechenden HTML 4 Doctype voraus. Aber T-Rex macht XML</p> <p>Wie auch immer, das Umschalten der strictErrorChecking und validateOnParse-Flags hat in der Sandbox keinen Unterschied gemacht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:32:56 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787091#m1787091 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787091#m1787091 <p>Hello,</p> <blockquote> <p>Wie auch immer, das Umschalten der strictErrorChecking und validateOnParse-Flags hat in der Sandbox keinen Unterschied gemacht.</p> </blockquote> <p>Aber die Angabe der Version und der Codierung sollte eine Wirkung haben. Bei mir hat der Parser dann auch erst funktioniert, als ich den Content-Type nochmal als Meta-Angabe davorgestanzt hatte.</p> <p>Ich benutze das so bis heute auf meinem Webserver in meinem automatischen Downloader für neue Software-Releases.</p> <p>Meine Meldung sollte auch nur eine Kurzanregung sein, keine fertige Lösung.</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> PHP DomDocument link tags sind leer Fri, 09 Apr 21 10:50:45 Z https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787098#m1787098 https://forum.selfhtml.org/self/2021/apr/09/php-domdocument-link-tags-sind-leer/1787098#m1787098 <p>Hello lieber Felix,</p> <blockquote> <blockquote> <p>hab hier einen xml: [...] @$objDom->loadHTML( $strContent );</p> </blockquote> <p>da hätte ich jetzt eine andere Methode erwartet, nämlich <a href="https://www.php.net/manual/de/domdocument.loadxml.php" rel="nofollow noopener noreferrer">loadXML</a>. In HTML haben <code><link></code>-Elemente nämlich keinen Inhalt, weil sie dort so definiert sind.</p> </blockquote> <p>Aufmerksam, aufmerksam!</p> <p>Habe ich eben ganz übersehen, dass er nach Inhalt und nicht nach Attributen suchte...</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div>