Antworten auf deine Fragen:
Neues Thema erstellen

mit php eine xml erstellen ?

winne52

Webmaster

Hallo ich bitte Euch mir zu helfen meinen Klemmer zu finden.
Ich möchte eine xml-Datei erzeugen die so aussehen sollte:

Code:
<?xml version="1.0" encoding="UTF-8"?>
-<units>
   -<unit unitownerid="123456" internalunitid="2213" internalunitid2="" container="availability">
      -<availability_year>
        <availability year="2016" start="AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA" />
        <availability year="2017" start="BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB" />
       <availability year="2018" start="AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA" />
    </availability_year>
  </unit>
</units>

Hier mein php-Script:
PHP:
<?php

$year1 = date("Y");
$year2 = $year1+1;
$year3 = $year1+2;

$dom = new DOMDocument('1.0', 'utf-8');

$root = $dom->createElement('units');


$unitownerid = '123456';
$internalunitid = '2213';
$jahr1 = 'AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA';
$jahr2 = 'BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB';
$jahr3 = 'AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA';


$element1 = array( $year1 => $jahr1);
$element2 = array( $year2 => $jahr2);
$element3 = array( $year3 => $jahr3);

$dom->appendChild($root);

$root->appendChild($firstNode = $dom->createElement("unit"));
$firstNode->setAttribute("container", "availability");
$firstNode->setAttribute("internalunitid2", "");
$firstNode->setAttribute("internalunitid", $internalunitid);
$firstNode->setAttribute("unitownerid", $unitownerid);


$firstNode->appendChild($firstNode = $dom->createElement("availability_year"));

    foreach ($element1 as $value1 => $jahr1) {
$firstNode->appendChild($firstNode = $dom->createElement("availability"));   
    $firstNode->setAttribute("start", $jahr1);   
    $firstNode->setAttribute("year", $value1);
    }
   
    foreach ($element2 as $value2 => $jahr2) {
$firstNode->appendChild($firstNode = $dom->createElement("availability"));   
    $firstNode->setAttribute("start", $jahr2);   
    $firstNode->setAttribute("year", $value2);
    }
   
    foreach ($element3 as $value3 => $jahr3) {
$firstNode->appendChild($firstNode = $dom->createElement("availability"));   
    $firstNode->setAttribute("start", $jahr3);   
    $firstNode->setAttribute("year", $value3);
    }

header('Content-type: text/xml; utf-8');

echo $dom->saveXML();
//echo $dom->save("availability.xml");
?>


Leider sieht sie aber so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
-<units>
  -<unit unitownerid="123456" internalunitid="2213" internalunitid2="" container="availability">
    -<availability_year>
      -<availability year="2016" start="AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA">
      -<availability year="2017" start="BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB">
      <availability year="2018" start="AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA"/>
      </availability>
      </availability>
    </availability_year>
  </unit>
</units>

Was mache ich falsch?
Danke im voraus
winne52
 

Duddle

Posting-Frequenz: 14µHz

Du setzt in jedem appendChild $firstNode auf den gerade eingehängten Knoten. Ergo wird das nächste neue Element Kind vom zuletzt eingehängten Element.


Duddle
 

winne52

Webmaster

Hallo Duddle,
kannst Du mir bitte eine entsprechende Fachliteratur empfehlen, um mich tiefgründiger damit zu beschäftigen.
Habe lange gesucht und nicht passendes in deutscher Sprache gefunden.
Schnittstellen XML-Dateien mit PHP in dieser Scriptform zu erstellen ist Neuland für mich und ich möchte die Zusammenhänge verstehen lernen.
(appendChild, firstNode, Element Kind u.s.w.)
Danke für Deine Hilfe.
winne52
 

Duddle

Posting-Frequenz: 14µHz

Nein, nicht wirklich. Im Endeffekt baust du ja nur einen Baum auf.
Ich rate mal, dass du den Code irgendwoher (hier?) kopiert hast ohne ihn komplett zu verstehen. Der nimmt aber ein paar Abkürzungen, die für das Verständnis nicht hilfreich sind. Beispielsweise ist
PHP:
$root = $dom->createElement('units');
$dom->appendChild($root);

$newNode = $dom->createElement("unit");
$newNode->setAttribute("container", "availability");
$root->appendChild($newNode);
besser lesbar ("Ich erstelle etwas und hänge es als Kind ein") als
PHP:
$dom->appendChild($root = $dom->createElement('units'));

$root->appendChild($newNode = $dom->createElement("unit"));
$newNode->setAttribute("container", "availability");
obwohl es das gleiche Ergebnis bringt.


Duddle
 

winne52

Webmaster

Danke für Deine Hilfe.
Ich habe versucht aus einem Tut diesen PHP-Script zu erstellen.
Ohne kopieren und einfügen habe ich versucht die XML-Vorgabe zu generieren. Ich baue diese vorgegebene XML als Neuling und wollte zum Verstehen mich belesen. Habe sehr wenig dazu gefunden.

Der Aufbau der XML-Datei ist mir vorgegeben .
Hier der Script nach Deiner Hilfe:
PHP:
<?php

$year1 = date("Y");
$year2 = $year1+1;
$year3 = $year1+2;

$dom = new DOMDocument('1.0', 'utf-8');

$root = $dom->createElement('units');


$unitownerid = '123456';
$internalunitid = '2213';
$jahr1 = 'AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA';
$jahr2 = 'BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB';
$jahr3 = 'AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA';


$element1 = array( $year1 => $jahr1);
$element2 = array( $year2 => $jahr2);
$element3 = array( $year3 => $jahr3);

$dom->appendChild($root);


$newNode = $dom->createElement("unit");
$newNode->setAttribute("container", "availability");
$newNode->setAttribute("internalunitid2", "");
$newNode->setAttribute("internalunitid", $internalunitid);
$newNode->setAttribute("unitownerid", $unitownerid);
$root->appendChild($newNode);


$root->appendChild($newNode = $dom->createElement("availability_year"));

    foreach ($element1 as $value1 => $jahr1) {
$root->appendChild($newNode = $dom->createElement("availability"));   
    $newNode->setAttribute("start", $jahr1);   
    $newNode->setAttribute("year", $value1);
    }
   
    foreach ($element2 as $value2 => $jahr2) {
$root->appendChild($newNode = $dom->createElement("availability"));   
    $newNode->setAttribute("start", $jahr2);   
    $newNode->setAttribute("year", $value2);
    }
   
    foreach ($element3 as $value3 => $jahr3) {
$root->appendChild($newNode = $dom->createElement("availability"));   
    $newNode->setAttribute("start", $jahr3);   
    $newNode->setAttribute("year", $value3);
    }

header('Content-type: text/xml; utf-8');

echo $dom->saveXML();
//echo $dom->save("availability.xml");
?>


nach Überarbeitung mittels Deiner Hilfe:.
die XML Datei:

Code:
<?xml version="1.0" encoding="UTF-8"?>

-<units>
<unit container="availability" unitownerid="123456" internalunitid="2213" internalunitid2=""/>
<availability_year/>
<availability year="2016" start="AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA"/>
<availability year="2017" start="BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB"/>
<availability year="2018" start="AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA"/>
</units>

Sie sollte aber so aussehen

Code:
<?xml version="1.0" encoding="UTF-8"?>

<units>
  - <unit container="availability" unitownerid="123456" internalunitid="2213" internalunitid2="">
   - <availability_year>

    <availability year="2016" start="AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA"/>

    <availability year="2017" start="BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB"/>

    <availability year="2018" start="AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA"/>
</availability_year>
</unit>
</units>

Würde mich freuen, wenn auch dank Deiner Hilfe die letzte Hürde genommen werden kann.

Danke Duddle
winne52
 

Duddle

Posting-Frequenz: 14µHz

Nochmal, du baust hier nur einen Baum auf. Je nachdem wo du die Kinder einhängst bekommst du dann das entsprechende XML.
Wenn du die Hierarchie nicht aus dem XML ablesen kannst, kannst du es dir auch aufmalen. So sieht das falsche Ergebnis aus:
TtmQqG8.png

und so das gewünschte:
8nrNnHn.png


Daran solltest du ablesen können, was du im Code falsch machst.


Duddle
 

winne52

Webmaster

Hallo Duddle,
danke für Deine Hilfe.
hier das Ergebnis:
Code:
<?xml version="1.0" encoding="UTF-8"?>

-<units>
    -<unit unitownerid="123456" internalunitid="2213" internalunitid2="" container="availability">
      -<availability_year>

          <availability year="2016" start="AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA"/>

          <availability year="2017" start="BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB"/>

          <availability year="2018" start="AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA"/>
      </availability_year>
    </unit>
</units>

Nochmals danke für die Anregungen und die Unterstützung.
Noch einen schönen Abend
winne52
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben