Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 02. Dezember 2020 21:35

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

[GELÖST] XML-Datei ausgeben

Hallo Forum,

hab gerade einen Knoten im Kopf - will eine XML-Datei einlesen und ausgeben.

Ersteres funktioniert, nur hab ich Schwierigkeiten auf das XML Objekt zuzugreifen. Ist garantiert ganz banal, nur ich komm eben nicht drauf.

Die XML Datei sieht so aus

<?xml version="1.0" encoding="UTF-8"?>
<gcodes>
  <gcode>
    <id>G0-G1</id>
    <kb_en>Linear Move</kb_en>
    <kb_de></kb_de>
    <b_en>Add a straight line movement to the planner</b_en>
    <b_de></b_de>
  </gcode>
</gcodes>

und mein Template so

{if file_exists('gcodes.xml')}
    {$xml = simplexml_load_file('gcodes.xml')}
{/if}

{if !empty($xml)}
  {foreach $xml->gcodes->gcode as $gcode}
    <h4>{$gcode->id} - {$gcode->kb_en}</h4>
    <p>{$gcode->b_en}</p>
    {if $gcode->b_de != ''}<p>{$gcode->b_de}</p>{/if}
    <hr> 
  {/foreach}
{/if}

Mit 'nem RSS Feed geht es problemlos durch, mit meiner XML aber nicht yikes . Es wird einfach gar nichts ausgegeben. Die XML ist "wellformed". Läuft auf PHP 7.4

Irgend eine Idee?

Offline

#2 02. Dezember 2020 22:10

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] XML-Datei ausgeben

{if !empty($xml)}
{foreach from=$xml->gcode item='gcode'} 
 <h4>{$gcode->id} - {$gcode->kb_en}</h4>
    <p>{$gcode->b_en}</p>
    {if $gcode->b_de != ''}<p>{$gcode->b_de}</p>{/if}
    <hr> 
{/foreach}
{/if}

Den Root-Node musst du nicht ansprechen.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#3 03. Dezember 2020 15:20

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

Re: [GELÖST] XML-Datei ausgeben

nockenfell schrieb:

Den Root-Node musst du nicht ansprechen.

Genau das war es  yikes  yikes  yikes ... funktioniert!

Danke dir!!!

Die Frage ist dann aber für mich. warum kann ich damit

[== Smarty ==]
{if !empty($xml)}
  {$cnt = 0}
  {foreach $xml->channel->item as $item}
    <h4>Name: <a href="{$item->link}">{$item->title}</a></h4>
    <p>{$item->author} / {$item->pubDate|date_format:'%e %B %Y'}</p>
    <p>Beschreibung: {$item->description}
    <p><a href="{$item->guid}">Zum Thingiverse Objekt &raquo;</a></p><hr>  
    {$cnt = $cnt + 1}
    {*if $cnt == 2}{break}{/if*}
  {/foreach}
{/if}

nen RSS Feed laden, der nicht viel anders aufgebaut ist  roll ?

Offline

#4 03. Dezember 2020 19:10

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] XML-Datei ausgeben

Gute Frage. Ich habe mich bei XML sehr viel mit DomDocument und DomXPath auseinander gesetzt, jedoch nicht mit simplexml. Möglicherweise kommt es auch die Struktur des XMLs an. Ein RSS Feed hat weitere Elemente neben den Items auf der gleichen Ebene.
Diese Erklärung ist zwar nicht wirklich logisch. Müsste das auch weiter testen.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#5 03. Dezember 2020 22:18

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

Re: [GELÖST] XML-Datei ausgeben

nockenfell schrieb:

Gute Frage. Ich habe mich bei XML sehr viel mit DomDocument und DomXPath auseinander gesetzt,

Da hätt ich gleich mal dazu die Frage - ich hab wie oben beschrieben einen RSS-Feed. {$item->description} sieht von der Struktur her immer so aus

<![CDATA[<div style="margin: 5px;"><a href="https://www.thingiverse.com/thing:4673852"><img src="https://cdn.thingiverse.com/assets/04/d1/fb/25/4d/Chat_Low_Poly_by_yiixpe.jpg"  class="preview_large" style="width: 240px; height: 180px"></a><br/></div><div><div><p>Mon imprimante: Ender 3 Pro</p>
.
.
.

Ich möchte jetzt diese URL

<img src="https://cdn.thingiverse.com/assets/04/d … yiixpe.jpg"  class="preview_large" style="width: 240px; height: 180px">

(also nur 1 Element) auslesen.

Ich weiß, dass das via DOM über getElementsByTagName("img") und getAttribute('src') funktioniert.

Aber wie wende ich das sinnvoll nur auf {$item->description} an?

nockenfell schrieb:

Möglicherweise kommt es auch die Struktur des XMLs an. Ein RSS Feed hat weitere Elemente neben den Items auf der gleichen Ebene.

Das war auch mein Gedanke. Hab's mangels Zeit aber nicht weiter getestet.

Offline

#6 04. Dezember 2020 12:50

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] XML-Datei ausgeben

Der Inhalt der Description ist mit CDATA maskiert, so dass innerhalb vom XML eine HTML Struktur eingefügt werden kann. Damit ist dieser Teil über simplexml / DomDocument / DomXPath nicht ansprechbar, resp. wird nicht als Teil der XML-Struktur interpretiert sondern als Inhalt. Ich nehme an, dass du mit simplexml für die Description einfach ein

<div style="margin: 5px;"><a href="https://www.thingiverse.com/thing:4673852"><img....

ohne das CDATA zurück erhältst. So ist es zumindest im DomDocument. Du kannst natürlich diesen Teil auch wieder als XML interpretieren. Dazu muss aus dem HTML ein DomDocument erstellt werden. Zu simplexml habe ich folgendes gefunden:

https://stackoverflow.com/questions/663 … rough-html

$html = file_get_contents('http://example.com/');
$doc = new DOMDocument();
$doc->loadHTML($html);
$sxml = simplexml_import_dom($doc);

Ich hätte das wohl rein über DomDocument gelöst:

$html = file_get_contents('http://example.com/');
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DomXPath($doc);
$link = $xpath->query('//img/@src')->item(0);

Den XPath habe ich nicht geprüft, nur aus dem Kopf geschrieben. Müsste so gehen.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline