Jak dynamicznie generować plik XML za pomocą PHP?

233

Muszę dynamicznie generować plik xml w czasie wykonywania. Pomóż mi w generowaniu poniższego pliku XML dynamicznie za pomocą PHP.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>

musicking123
źródło
1
Również pamiętaj, xml 1.0 nie jest obsługiwany przez wszystkie wyszukiwarki. Polecam xml 0.9, ponieważ jest to najbardziej znana wersja xml!
Domuta Marcel
Wygeneruj plik XML za pomocą PHP i MySQL - kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha
1
@Kvvaradha, które nie jest dobrym rozwiązaniem
Robertert

Odpowiedzi:

358

Użyłbym SimpleXMLElement .

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());
Ivan Krechetov
źródło
12
Czy można określić kodowanie za pomocą SimpleXml? Jak można to zrobić?
Eineki
1
Cześć, próbowałem twój przykład, ale w trakcie sprawdzania dostaję 2 ostrzeżenia. Jak je usunąć? validator.w3.org/…
Satya,
3
@Eineki wystarczy dodać <?xml version="1.0" encoding="WHATEVER_IT_IS"?>instrukcję przetwarzania. Wierzę, że SimpleXMLElement zrobi właściwą rzecz: konwertuje wszystkie kwerendy ciągów znaków na twoje mb_internal_encoding.
Ivan Krechetov
33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang
Pojawia się „błąd w wierszu 2 w kolumnie 6: Deklaracja XML dozwolona tylko na początku dokumentu”; kod dodaje dodatkową pustą linię na początku pliku XML, co powoduje błąd analizy.
Elia Weiss,
179

Aby utworzyć XMLdocument w PHP, należy utworzyć instancję klasy DOMDocument, utworzyć węzły potomne i dołączyć te węzły do ​​właściwej gałęzi drzewa dokumentów.

W celach informacyjnych możesz przeczytać http://it.php.net/manual/en/book.dom.php

Teraz zajmiemy się krótkim kodem poniżej.

  • w linii 2 tworzymy pusty dokument xml (wystarczy podać wersję xml (1.0) i kodowanie (utf8))
  • teraz musimy wypełnić drzewo xml:
    • Musimy stworzyć xmlnode (linia 5)
    • i musimy dołączyć to we właściwej pozycji. Tworzymy katalog główny, więc dołączamy go bezpośrednio do dokumentu domowego.
    • Uwaga: Utwórz element, dodaj element do węzła i zwróć węzeł wstawiony, zapisujemy to odniesienie, aby dołączyć węzły ścieżkowe do węzła głównego (nawiasem mówiąc, zwane xml).

To są podstawy, możesz utworzyć i dołączyć węzeł tylko w linii (na przykład 13.), możesz robić wiele innych rzeczy z dom api. To zależy od Ciebie.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

Edycja: Jeszcze jedna wskazówka: Główną zaletą korzystania z xmldocument (dokument domowy lub simplexml) zamiast drukowania xml jest to, że xmltree można przeszukiwać za pomocą zapytania xpath

Eineki
źródło
6
czy mogę ponownie użyć $domtree->save('mypath/xmlfile.xml');?
guitarlass
1
@guitarlass Masz rację. save i saveXML są podobne: pierwszy zrzuć xmltree do pliku, drugi do łańcucha (i możesz zapisać go w następnym kroku ze zwykłymi dyrektywami zapisywania plików).
Eineki
4
@jjonesdesign Musisz ciężko pracować, aby zdobyć wiedzę potrzebną do lenistwa :)
Eineki
1
Przykład generuje jedną długą linię zamiast podziału na elementy XML. Musisz dodać, $domtree->formatOutput = true;aby wynik był ładny :)
JackTheKnife
1
@Drenyl dodaj odpowiedni nagłówek typu zawartości oraz a Content-Disposition: attachmenti wydrukuj wynik saveXml. Możesz także zaproponować nazwę pliku.
Eineki,
27

Łatwy do złamania sposób to:

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

zapisz jako .php

andyk
źródło
18
łatwe, ale podatne na błędy, gdy interpolowane są zmienne zawierające metaznaki XML, takie jak nawiasy kątowe i znaki handlowe
Matthew Lock
15

Dzięki FluidXML możesz bardzo łatwo wygenerować swój XML.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml

Daniele Orlando
źródło
2
FluidXML w ostatniej wersji obsługuje PHP 5 .
Daniele Orlando,
4
Zewnętrzna biblioteka do zrobienia czegoś, co można łatwo zrobić w natywnym PHP za pomocą SimpleXML, nie jest rozwiązaniem.
robertmain
4

Spójrz na system szablonów Tiny But Strong . Zwykle służy do tworzenia szablonów HTML, ale istnieje rozszerzenie, które działa z plikami XML. Używam tego szeroko do tworzenia raportów, w których mogę mieć jeden plik kodu i dwa pliki szablonów - htm i xml - a użytkownik może następnie wybrać, czy wysłać raport do ekranu czy arkusza kalkulacyjnego.

Kolejną zaletą jest to, że nie musisz kodować xml od zera, w niektórych przypadkach chciałem wyeksportować bardzo duże złożone arkusze kalkulacyjne, a zamiast kodować cały eksport, wystarczy zapisać istniejący arkusz kalkulacyjny w xml i zamień w tagach kodu, w których wymagane jest wyjście danych. To szybki i bardzo wydajny sposób pracy.

Cruachan
źródło
-14
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

Wystarczy połączyć się z bazą danych, aby utworzyć plik test.xml w folderze projektu

pratik
źródło
26
Jest to rodzaj kodu, który nigdy nie powinien widzieć produkcji. W zależności od danych, które wysyłasz, możesz utworzyć niepoprawny (tzn. Nie dający się oddzielić) kod XML. W najlepszym razie jest niechlujny i chociaż może wydawać się łatwy, ponieważ możesz zaoszczędzić kilka linii kodu, będzie cię to później kosztowało w zakresie konserwacji i debugowania; nie wspominając o biedaku, który pewnego dnia może przejąć odpowiedzialność za twoją pracę.
Arne,
3
-1 najpierw łącząc ciąg z jakimś wanna-be-xml, a następnie wpychając ten ciąg do SimpleXML - To wygląda na odwrócone do góry nogami. Zamiast tego najpierw zainicjuj obiekt biblioteki XML, a następnie użyj go do zbudowania XML. Jest to łatwiejsze, zużywa mniej pamięci, jest mniej podatne na błędy i pozwala na przesyłanie strumieniowe XML do pliku lub standardowego wyjścia.
hakre
2
Może czas usunąć tę odpowiedź (a odzyskasz utraconą reputację!).
Jose Manuel Abarca Rodríguez
Myślę, że powinien zostać. Po raz pierwszy zrobiłem trochę kodu, pracując z XML i wyglądało to trochę tak, więc bardzo pomocne było zobaczenie, czego NIE robić.
Peter Højlund Andersen