XML Wrangler ist eine vereinfachte PHP -Bibliothek, mit der das Lesen und das Schreiben von XML einfach ist. XML Wrangler wurde mit dem Entwicklererlebnis erstellt - Sie können jede Art von XML -Datei auch mit komplexen Namespaces und sogar großen XML -Dateien lesen. Es wird auch Ausnahmen werfen, wenn der XML ungültig ist!
XML Wrangler wird über Komponist installiert.
composer require saloonphp/xml-wrangler
Benötigt PHP 8.1+
Das Lesen von XML kann durch Übergeben der XML -Zeichenfolge oder -datei in den XML -Leser und mit einer der vielen Methoden zur Suche und Ermittlung eines bestimmten Elements oder Werts verwendet werden. Sie können jedes Element auch in ein leicht durchquertes Array umwandeln, wenn Sie es vorziehen. Wenn Sie auf ein Element zugreifen müssen, können Sie das Element DTO verwenden, bei dem es sich um eine einfache Klasse handelt, um auf den Inhalt und die Attribute zuzugreifen. XML Wrangler stellt Methoden zur Verfügung, um mehrere Elemente durchzuführen und gleichzeitig jeweils ein Element im Speicher zu halten.
< breakfast_menu >
< food soldOut = " false " bestSeller = " true " >
< name >Belgian Waffles</ name >
< price >$5.95</ price >
< description >Two of our famous Belgian Waffles with plenty of real maple syrup</ description >
< calories >650</ calories >
</ food >
< food soldOut = " false " bestSeller = " false " >
< name >Strawberry Belgian Waffles</ name >
< price >$7.95</ price >
< description >Light Belgian waffles covered with strawberries and whipped cream</ description >
< calories >900</ calories >
</ food >
< food soldOut = " false " bestSeller = " true " >
< name >Berry-Berry Belgian Waffles</ name >
< price >$8.95</ price >
< description >Light Belgian waffles covered with an assortment of fresh berries and whipped cream</ description >
< calories >900</ calories >
</ food >
</ breakfast_menu > <?php
use Saloon XmlWrangler XmlReader ;
$ reader = XmlReader :: fromString ( $ xml );
// Retrieve all values as one simple array
$ reader -> values (); // ['breakfast_menu' => [['name' => '...'], ['name' => '...'], ['name' => '...']]
// Use dot-notation to find a specific element
$ reader -> value ( ' food.0 ' )-> sole (); // ['name' => 'Belgian Waffles', 'price' => '$5.95', ...]
// Use the element method to get a simple Element DTO containing attributes and content
$ reader -> element ( ' food.0 ' )-> sole (); // Element::class
// Use XPath to query the XML
$ reader -> xpathValue ( ' //food[@bestSeller="true"]/name ' )-> get (); // ['Belgian Waffles', 'Berry-Berry Belgian Waffles']
// Use getAttributes() to get the attributes on the elements
$ reader -> element ( ' food.0 ' )-> sole ()-> getAttributes (); // ['soldOut' => false, 'bestSeller' => true]
// Use getContent() to get the contents of the elements
$ reader -> element ( ' food.0 ' )-> sole ()-> getContent (); // ['name' => 'Belgian Waffles', 'price' => '$5.95', ...] Das Schreiben von XML ist so einfach wie das Definieren eines PHP -Arrays und die Verwendung von Schlüssel und Werten zur Definition von Elementen. Wenn Sie Elemente mit ein paar weiteren Eigenschaften wie Attributen oder Namespaces definieren müssen, können Sie das Element DTO verwenden, um fortschrittlichere Elemente zu definieren.
<?php
use Saloon XmlWrangler Data Element ;
use Saloon XmlWrangler XmlWriter ;
$ writer = new XmlWriter ;
$ xml = $ writer -> write ( ' breakfast_menu ' , [
' food ' => [
[
' name ' => ' Belgian Waffles ' ,
' price ' => ' $5.95 ' ,
' description ' => ' Two of our famous Belgian Waffles with plenty of real maple syrup ' ,
' calories ' => ' 650 ' ,
],
[
' name ' => ' Strawberry Belgian Waffles ' ,
' price ' => ' $7.95 ' ,
' description ' => ' Light Belgian waffles covered with strawberries and whipped cream ' ,
' calories ' => ' 900 ' ,
],
// You can also use the Element class if you need to define elements with
// namespaces or with attributes.
Element :: make ([
' name ' => ' Berry-Berry Belgian Waffles ' ,
' price ' => ' $8.95 ' ,
' description ' => ' Light Belgian waffles covered with an assortment of fresh berries and whipped cream ' ,
' calories ' => ' 900 ' ,
])-> setAttributes ([ ' bestSeller ' => ' true ' ]),
],
]);Der obige Code erstellt den folgenden XML
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< breakfast_menu >
< food >
< name >Belgian Waffles</ name >
< price >$5.95</ price >
< description >Two of our famous Belgian Waffles with plenty of real maple syrup</ description >
< calories >650</ calories >
</ food >
< food >
< name >Strawberry Belgian Waffles</ name >
< price >$7.95</ price >
< description >Light Belgian waffles covered with strawberries and whipped cream</ description >
< calories >900</ calories >
</ food >
< food bestSeller = " true " >
< name >Berry-Berry Belgian Waffles</ name >
< price >$8.95</ price >
< description >Light Belgian waffles covered with an assortment of fresh berries and whipped cream</ description >
< calories >900</ calories >
</ food >
</ breakfast_menu >Dieser Abschnitt in der Dokumentation dient zur Verwendung des XML -Lesers.
Der XML -Leser kann eine Vielzahl von Eingabetypen akzeptieren. Sie können eine XML -Zeichenfolge, eine Datei oder eine Ressource zur Verfügung stellen. Sie können die XML auch direkt aus einer PSR -Antwort (wie aus Guzzle) oder einer Salonantwort lesen.
use Saloon XmlWrangler XmlReader ;
$ reader = XmlReader :: fromString ( ' <?xml version="1.0" encoding="utf-8"?><breakfast_menu>... ' );
$ reader = XmlReader :: fromFile ( ' path/to/file.xml ' );
$ reader = XmlReader :: fromStream ( fopen ( ' path/to/file.xml ' , ' rb ' );
$ reader = XmlReader :: fromPsrResponse ( $ response );
$ reader = XmlReader :: fromSaloonResponse ( $ response );Warnung aufgrund von Einschränkungen der zugrunde liegenden PHP XMLReader -Klasse, der
fromStream,fromPsrResponseundfromSaloon-Methoden erstellen eine temporäre Datei auf Ihrem Maschinen/Server, aus der das Lesen automatisch entfernt wird, wenn der Leser zerstört wird. Sie müssen sicherstellen, dass Sie über genügend Speicherplatz auf Ihrem Computer verfügen, um diese Methode zu verwenden.
Sie können die elements und values verwenden, um das gesamte XML -Dokument in ein Array umzuwandeln. Wenn Sie ein Array von Werten wünschen, verwenden Sie die values . Wenn Sie jedoch auf die Elemente zugreifen müssen, gibt die elements -Methode ein Array von Element -DTOs zurück.
$ reader = XmlReader :: fromString (...);
$ elements = $ reader -> elements (); // Array of `Element::class` DTOs
$ values = $ reader -> values (); // Array of values.Hinweis Wenn Sie eine große XML -Datei lesen, sollten Sie stattdessen die
elementodervalueverwenden. Diese Methoden können große XML -Dateien durch den Speicher durchführen.
Sie können die value verwenden, um den Wert eines bestimmten Elements zu erhalten. Sie können Dot-NOTATION verwenden, um nach Kinderelementen zu suchen. Sie können auch ganze Zahlen verwenden, um bestimmte Positionen mehrerer Elemente zu finden. Diese Methode sucht auf speichereffiziente Weise durch den gesamten XML-Körper.
Diese Methode gibt eine LazyQuery -Klasse zurück, die unterschiedliche Methoden zum Abrufen der Daten enthält.
$ reader = XmlReader :: fromString ( '
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>Sammyjo20</name>
<favourite-songs>
<song>Luke Combs - When It Rains It Pours</song>
<song>Sam Ryder - SPACE MAN</song>
<song>London Symfony Orchestra - Starfield Suite</song>
</favourite-songs>
</person>
' );
$ reader -> value ( ' person.name ' )-> sole () // ' Sammyjo20 '
$ reader -> value ( ' song ' )-> get (); // ['Luke Combs - When It Rains It Pours', 'Sam Ryder - SPACE MAN', ...]
$ reader -> value ( ' song.2 ' )-> sole (); // 'London Symfony Orchestra - Starfield Suite' Sie können die element verwenden, um nach einem bestimmten Element zu suchen. Diese Methode bietet eine Element , die den Wert und die Attribute enthält. Sie können Dot-NOTATION verwenden, um nach Kinderelementen zu suchen. Sie können auch ganze Zahlen verwenden, um bestimmte Positionen mehrerer Elemente zu finden. Diese Methode sucht auf Speicher effizient durch den gesamten XML -Körper.
Diese Methode gibt eine LazyQuery -Klasse zurück, die unterschiedliche Methoden zum Abrufen der Daten enthält.
$ reader = XmlReader :: fromString ( '
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>Sammyjo20</name>
<favourite-songs>
<song>Luke Combs - When It Rains It Pours</song>
<song>Sam Ryder - SPACE MAN</song>
<song>London Symfony Orchestra - Starfield Suite</song>
</favourite-songs>
</person>
' );
$ reader -> element ( ' name ' )-> sole (); // Element('Sammyjo20')
$ reader -> element ( ' song ' )-> get (); // [Element('Luke Combs - When It Rains It Pours'), Element('Sam Ryder - SPACE MAN'), ...]
$ reader -> element ( ' song.2 ' )-> sole (); // Element('London Symfony Orchestra - Starfield Suite') Manchmal ist es einfacher, ein XML -Dokument zu durchqueren, wenn Sie sich keine Sorgen über Namespaces und Präfixe für Elemente machen müssen. Wenn Sie sie entfernen möchten, können Sie die Methode removeNamespaces() für den Leser verwenden.
$ reader = XmlReader :: fromString (...);
$ reader -> removeNamespaces (); Bei der Suche nach einer großen Datei können Sie die lazy oder collectLazy Methoden verwenden, die einen Generator der Ergebnisse zurückgeben, das jeweils nur ein Element im Speicher hält.
$ names = $ reader -> element ( ' name ' )-> lazy ();
foreach ( $ names as $ name ) {
//
} Wenn Sie Laravel verwenden, können Sie die collect und collectLazy verwenden, mit denen die Elemente in eine Laravel -Sammlung/faule Sammlung umgewandelt werden können. Wenn Sie Laravel nicht verwenden, können Sie das illuminate/collections über Komponist installieren, um diese Funktionalität hinzuzufügen.
$ names = $ reader -> value ( ' name ' )-> collect ();
$ names = $ reader -> value ( ' name ' )-> collectLazy (); Manchmal möchten Sie möglicherweise nach einem bestimmten Element oder Wert suchen, bei dem das Element ein bestimmtes Attribut enthält. Sie können dies tun, indem Sie ein zweites Argument für die value oder element vorlegen. Dadurch wird das letzte Element für die Attribute durchsucht und kehrt zurück, wenn sie übereinstimmen.
$ reader = XmlReader :: fromString ( '
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>Sammyjo20</name>
<favourite-songs>
<song>Luke Combs - When It Rains It Pours</song>
<song>Sam Ryder - SPACE MAN</song>
<song recent="true">London Symfony Orchestra - Starfield Suite</song>
</favourite-songs>
</person>
' );
$ reader -> element ( ' song ' , [ ' recent ' => ' true ' ])-> sole (); // Element('London Symfony Orchestra - Starfield Suite')
$ reader -> value ( ' song ' , [ ' recent ' => ' true ' ])-> sole (); // 'London Symfony Orchestra - Starfield Suite'XPath ist eine fantastische Möglichkeit, XML zu durchsuchen. Mit einer Zeichenfolge können Sie nach einem bestimmten Element mit bestimmten Attributen oder Indizes suchen. Wenn Sie am Lernen von XPath interessiert sind, können Sie hier klicken, um ein nützliches Cheatsblatt zu erhalten.
Sie können die xpathValue -Methode verwenden, um den Wert eines bestimmten Elements mit einer XPath -Abfrage zu finden. Diese Methode gibt eine Query zurück, die unterschiedliche Methoden zum Abrufen der Daten enthält.
<?php
$ reader = XmlReader :: fromString (...);
$ reader -> xpathValue ( ' //person/favourite-songs/song[3] ' )-> sole (); // 'London Symfony Orchestra - Starfield Suite' Sie können die xpathElement -Methode verwenden, um ein bestimmtes Element mit einer XPath -Abfrage zu finden. Diese Methode gibt eine Query zurück, die unterschiedliche Methoden zum Abrufen der Daten enthält.
<?php
$ reader = XmlReader :: fromString (...);
$ reader -> xpathElement ( ' //person/favourite-songs/song[3] ' )-> sole (); // Element('London Symfony Orchestra - Starfield Suite')Warnung aufgrund von Einschränkungen mit XPath - Die obigen Methoden zur Abfrage mit XPath sind nicht Speichersicher und sind möglicherweise nicht für große XML -Dokumente geeignet.
Vielleicht haben Sie sich mit einem XML -Dokument befunden, das ein nicht vorgefertigtes xmlns -Attribut enthält - wie folgt:
< container xmlns = " http://example.com/xml-wrangler/person " xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " /> In diesem Fall wird XML Wrangler diese nicht vorgefertigten Namespaces automatisch entfernen, um die Kompatibilität zu verbessern. Wenn Sie diese Namespaces beibehalten möchten, können Sie setXpathNamespaceMap verwenden, um jeden nicht vorgefertigten XML-Namespace zuzuordnen.
$ reader = XmlReader :: fromString (...);
$ reader -> setXpathNamespaceMap ([
' root ' => ' http://example.com/xml-wrangler/person ' ,
]);
$ reader -> xpathValue ( ' //root:person/root:favourite-songs/root:song[3] ' )-> sole ();Dieser Abschnitt in der Dokumentation dient zur Verwendung des XML -Autors.
Die grundlegendste Verwendung des Lesers besteht darin, String -Schlüssel für die Elementnamen und -Werte für die Werte des Elements zu verwenden. Der Schriftsteller akzeptiert unendlich verschachtelte Arrays für verschachtelte Elemente.
use Saloon XmlWrangler XmlWriter ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [
' name ' => ' Sam ' ,
' twitter ' => ' @carre_sam ' ,
' facts ' => [
' favourite-song ' => ' Luke Combs - When It Rains It Pours '
],
]);Der obige Code wird in die folgenden XML konvertiert
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< root >
< name >Sam</ name >
< twitter >@carre_sam</ twitter >
< facts >
< favourite-song >Luke Combs - When It Rains It Pours</ favourite-song >
</ facts >
</ root > Beim Schreiben von XML müssen Sie häufig Attribute und Namespaces in Ihren Elementen definieren. Sie können die Element im Array von XML verwenden, um ein Element mit einem Attribut oder Namespace hinzuzufügen. Sie können die Element mit anderen Arrays und Stringwerten mischen.
use Saloon XmlWrangler XmlWriter ;
use Saloon XmlWrangler Data Element ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [
' name ' => ' Sam ' ,
' twitter ' => Element :: make ( ' @carre_sam ' )-> addAttribute ( ' url ' , ' https://twitter.com/@carre_sam ' ),
' facts ' => [
' favourite-song ' => ' Luke Combs - When It Rains It Pours '
],
' soap:custom-namespace ' => Element :: make ()-> addNamespace ( ' soap ' , ' http://www.w3.org/2003/05/soap-envelope ' ),
]);Dies führt zu den folgenden XML
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< root >
< name >Sam</ name >
< twitter url = " https://twitter.com/@carre_sam " >@carre_sam</ twitter >
< facts >
< favourite-song >Luke Combs - When It Rains It Pours</ favourite-song >
</ facts >
< soap : custom-namespace xmlns : soap = " http://www.w3.org/2003/05/soap-envelope " />
</ root >Sie müssen oft eine Reihe von Elementen definieren. Sie können dies tun, indem Sie einfach eine Reihe von Werten oder Elementklassen bereitstellen.
use Saloon XmlWrangler XmlWriter ;
use Saloon XmlWrangler Data Element ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [
' name ' => ' Luke Combs ' ,
' songs ' => [
' song ' => [
' Fast Car ' ,
' The Kind Of Love We Make ' ,
' Beautiful Crazy ' ,
Element :: make ( ' She Got The Best Of Me ' )-> addAttribute ( ' hit ' , ' true ' ),
],
],
]);Dies führt zu den folgenden XML
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< root >
< name >Luke Combs</ name >
< songs >
< song >Fast Car</ song >
< song >The Kind Of Love We Make</ song >
< song >Beautiful Crazy</ song >
< song hit = " true " >She Got The Best Of Me</ song >
</ songs >
</ root > Manchmal müssen Sie möglicherweise den Namen des Stammelements ändern. Dies kann als erstes Argument der write angepasst werden.
$ xml = XmlWriter :: make ()-> write ( ' custom-root ' , [...]) Wenn Sie dem Stammelement Attribute und Namespaces hinzufügen möchten, können Sie auch hier eine RootElement -Klasse verwenden.
use Saloon XmlWrangler Data RootElement ;
$ rootElement = RootElement :: make ( ' root ' )-> addNamespace ( ' soap ' , ' http://www.w3.org/2003/05/soap-envelope ' );
$ xml = XmlWriter :: make ()-> write ( $ rootElement , [...]) Wenn Sie ein CDATA -Tag hinzufügen müssen, können Sie die CDATA -Klasse verwenden.
use Saloon XmlWrangler Data CDATA ; use Saloon XmlWrangler XmlWriter ;
use Saloon XmlWrangler Data Element ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [
' name ' => ' Sam ' ,
' custom ' => CDATA :: make ( ' Here is some CDATA content! ' ),
]);Dies führt zu den folgenden XML
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< root >
< name >Sam</ name >
< custom > <![CDATA[ Here is some CDATA content! ]]> </ custom >
</ root > Manchmal haben Sie möglicherweise einen Teil von XML, den Sie in Ihrer Bewerbung in mehreren XML -Anfragen wiederverwenden. Mit XML Wrangler können Sie "komponierbare" Elemente erstellen, in denen Sie Ihren XML-Inhalt in einer Klasse definieren können, die Sie in Ihrer Anwendung wiederverwenden können. Erweitern Sie die Element und verwenden Sie die geschützte statische compose .
<?php
use Saloon XmlWrangler XmlWriter ;
use Saloon XmlWrangler Data Element ;
class BelgianWafflesElement extends Element
{
protected function compose (): void
{
$ this
-> setAttributes ([
' soldOut ' => ' false ' ,
' bestSeller ' => ' true ' ,
])
-> setContent ([
' name ' => ' Belgian Waffles ' ,
' price ' => ' $5.95 ' ,
' description ' => ' Two of our famous Belgian Waffles with plenty of real maple syrup ' ,
' calories ' => ' 650 ' ,
]);
}
}
$ writer = XmlWriter :: make ()-> write ( ' root ' , [
' food ' => new BelgianWafflesElement ,
]);Dies führt zu XML wie folgt:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< breakfast_menu >
< food soldOut = " false " bestSeller = " true " >
< name >Belgian Waffles</ name >
< price >$5.95</ price >
< description >Two of our famous Belgian Waffles with plenty of real maple syrup</ description >
< calories >650</ calories >
</ food >
</ breakfast_menu > Die Standard-XML-Codierung ist utf-8 , die Standardversion von XML ist 1.0 und der Standard-Standalone ist null (XML-Parser interpretieren kein eigenständiges Attribut wie false ). Wenn Sie dies mit dem setXmlEncoding , setXmlVersion und setXmlStandalone -Methoden des Autors anpassen möchten.
use Saloon XmlWrangler XmlWriter ;
$ writer = new XmlWriter ();
$ writer -> setXmlEncoding ( ' ISO-8859-1 ' );
$ writer -> setXmlVersion ( ' 2.0 ' );
$ writer -> setXmlStandalone ( true );
// $writer->write(...); Was führt zur XML-Deklaration <?xml version="2.0" encoding="ISO-8859-1" standalone="yes"?> .
Sie können dem XML eine benutzerdefinierte "Verarbeitungsanweisung" hinzufügen, indem Sie die addProcessingInstruction -Methode verwenden.
use Saloon XmlWrangler XmlWriter ;
$ writer = new XmlWriter ();
$ writer -> addProcessingInstruction ( ' xml-stylesheet ' , ' type="text/xsl" href="base.xsl" ' );
$ xml = $ writer -> write ( ' root ' , [ ' name ' => ' Sam ' ]);Dies führt zu den folgenden XML
<? xml version = " 1.0 " encoding = " utf-8 " ?>
<? xml-stylesheet type = " text/xsl " href = " base.xsl " ?>
< root >
< name >Sam</ name >
</ root > Standardmäßig wird der geschriebene XML nicht abgebaut. Sie können der write das dritte Argument zur Minimierung des XML vorlegen.
use Saloon XmlWrangler XmlWriter ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [...], minified: true );XML Wrangler ist ein einfacher Wrapper um zwei wirklich leistungsstarke Bibliotheken, die viel von der Beinarbeit erledigen. Beide Bibliotheken sind fantastisch und verdienen einen Stern!