XML Wrangler는 XML을 쉽게 읽고 쓰도록 설계된 단순한 PHP 라이브러리입니다. XML Wrangler는 개발자 경험을 염두에두고 구축되었습니다. 복잡한 네임 스페이스 및 대형 XML 파일을 사용하여 모든 유형의 XML 파일을 읽을 수 있습니다. XML이 유효하지 않으면 예외를 제외합니다!
XML Wrangler는 Composer를 통해 설치됩니다.
composer require saloonphp/xml-wrangler
PHP 8.1+가 필요합니다
XML 문자열 또는 파일을 XML 리더로 전달하고 많은 방법 중 하나를 사용하여 특정 요소 또는 값을 검색하고 찾으면 XML을 읽을 수 있습니다. 원하는 경우 모든 요소를 쉽게 가로 질 수있는 배열로 변환 할 수도 있습니다. 요소에서 속성에 액세스 해야하는 경우 내용 및 속성에 액세스하기 위해 간단한 클래스 인 Element
DTO를 사용할 수 있습니다. XML Wrangler는 한 번에 하나의 요소를 메모리에 유지하면서 여러 요소를 통해 반복하는 방법을 제공합니다.
< 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', ...]
XML을 작성하는 것은 PHP 배열을 정의하고 키와 값을 사용하여 요소를 정의하는 것만 큼 간단합니다. 속성이나 네임 스페이스와 같은 몇 가지 특성으로 요소를 정의 해야하는 경우 Element
DTO를 사용하여 고급 요소를 정의 할 수 있습니다.
<?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 ' ]),
],
]);
위의 코드는 다음 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 >
문서 의이 섹션은 XML 리더를 사용하는 것입니다.
XML 리더는 다양한 입력 유형을 허용 할 수 있습니다. XML 문자열, 파일을 사용하거나 리소스를 제공 할 수 있습니다. PSR 응답 (Guzzle에서) 또는 술집 응답에서 XML을 직접 읽을 수도 있습니다.
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 );
경고 기본 PHP XMLREADER 클래스,
fromStream
,fromPsrResponse
및fromSaloon
메소드의 제한으로 인해 읽기로부터 읽을 수있는 임시 파일을 작성하여 독자가 파괴 될 때 자동으로 제거됩니다. 이 방법을 사용하기에 컴퓨터에 충분한 저장 공간이 있는지 확인해야합니다.
elements
및 values
메소드를 사용하여 전체 XML 문서를 배열로 변환 할 수 있습니다. 값 배열을 원한다면 values
메소드를 사용하십시오. 그러나 요소에서 속성에 액세스 해야하는 경우 elements
메소드는 Element
DTO 배열을 반환합니다.
$ reader = XmlReader :: fromString (...);
$ elements = $ reader -> elements (); // Array of `Element::class` DTOs
$ values = $ reader -> values (); // Array of values.
참고 큰 XML 파일을 읽는 경우 대신
element
또는value
메소드를 사용해야합니다. 이러한 방법은 메모리가 부족하지 않고 큰 XML 파일을 반복 할 수 있습니다.
value
방법을 사용하여 특정 요소의 값을 얻을 수 있습니다. 닷 노트를 사용하여 자식 요소를 검색 할 수 있습니다. 정수를 사용하여 여러 요소의 특정 위치를 찾을 수도 있습니다. 이 방법은 전체 XML 본체를 통해 메모리 효율적인 방식으로 검색합니다.
이 메소드는 데이터를 검색하기 위해 다른 메소드를 갖는 LazyQuery
클래스를 반환합니다.
$ 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'
element
메소드를 사용하여 특정 요소를 검색 할 수 있습니다. 이 방법은 값과 속성을 포함하는 Element
클래스를 제공합니다. 닷 노트를 사용하여 자식 요소를 검색 할 수 있습니다. 정수를 사용하여 여러 요소의 특정 위치를 찾을 수도 있습니다. 이 방법은 전체 XML 본체를 통해 메모리 효율적인 방식으로 검색합니다.
이 방법은 데이터를 검색하는 방법이 다른 LazyQuery
클래스를 반환합니다.
$ 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')
때로는 네임 스페이스와 접두사에 대해 요소에 걱정할 필요가 없을 때 XML 문서를 통과하는 것이 더 쉽습니다. 제거하려면 리더의 removeNamespaces()
메소드를 사용할 수 있습니다.
$ reader = XmlReader :: fromString (...);
$ reader -> removeNamespaces ();
큰 파일을 검색 할 때는 lazy
또는 collectLazy
메소드를 사용하여 한 번에 하나의 항목을 메모리에만 유지하는 결과의 생성기를 반환 할 수 있습니다.
$ names = $ reader -> element ( ' name ' )-> lazy ();
foreach ( $ names as $ name ) {
//
}
Laravel을 사용하는 경우 collect
및 collectLazy
방법을 사용하여 요소를 Laravel Collection/Lazy Collection으로 변환 할 수 있습니다. Laravel을 사용하지 않는 경우 Composer를 통해 illuminate/collections
패키지를 설치 하여이 기능을 추가 할 수 있습니다.
$ names = $ reader -> value ( ' name ' )-> collect ();
$ names = $ reader -> value ( ' name ' )-> collectLazy ();
때로는 요소에 특정 속성이 포함 된 특정 요소 또는 값을 검색 할 수도 있습니다. value
또는 element
방법에 대한 두 번째 인수를 제공하여이를 수행 할 수 있습니다. 이것은 속성에 대한 마지막 요소를 검색하고 일치하면 반환됩니다.
$ 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는 XML을 통해 검색하는 환상적인 방법입니다. 하나의 문자열을 사용하면 특정 속성 또는 인덱스로 특정 요소를 검색 할 수 있습니다. XPath 학습에 관심이 있으시면 유용한 치트 시트를 보려면 여기를 클릭하십시오.
xpathValue
메소드를 사용하여 xpath 쿼리를 사용하여 특정 요소의 값을 찾을 수 있습니다. 이 메소드는 데이터를 검색하는 다른 방법이있는 Query
클래스를 반환합니다.
<?php
$ reader = XmlReader :: fromString (...);
$ reader -> xpathValue ( ' //person/favourite-songs/song[3] ' )-> sole (); // 'London Symfony Orchestra - Starfield Suite'
xpathElement
메소드를 사용하여 XPath 쿼리가있는 특정 요소를 찾을 수 있습니다. 이 메소드는 데이터를 검색하는 다른 방법이있는 Query
클래스를 반환합니다.
<?php
$ reader = XmlReader :: fromString (...);
$ reader -> xpathElement ( ' //person/favourite-songs/song[3] ' )-> sole (); // Element('London Symfony Orchestra - Starfield Suite')
XPath의 제한으로 인한 경고 - XPath로 쿼리하는 데 사용되는 위의 방법은 메모리 안전하지 않으며 큰 XML 문서에 적합하지 않을 수 있습니다.
정제되지 않은 xmlns
속성이 포함 된 XML 문서를 통해 다음과 같이 찾을 수 있습니다.
< container xmlns = " http://example.com/xml-wrangler/person " xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance " />
이런 일이 발생하면 XML Wrangler는 이러한 정제되지 않은 네임 스페이스를 자동으로 제거하여 호환성을 향상시킵니다. 이 네임 스페이스를 유지하려면 setXpathNamespaceMap
사용하여 각각의 정제되지 않은 각각의 XML 네임 스페이스를 매핑 할 수 있습니다.
$ reader = XmlReader :: fromString (...);
$ reader -> setXpathNamespaceMap ([
' root ' => ' http://example.com/xml-wrangler/person ' ,
]);
$ reader -> xpathValue ( ' //root:person/root:favourite-songs/root:song[3] ' )-> sole ();
문서 의이 섹션은 XML 작가 사용을위한 것입니다.
독자의 가장 기본적인 사용법은 요소 값의 요소 이름과 값에 문자열 키를 사용하는 것입니다. 작가는 중첩 요소에 대한 무한한 중첩 어레이를 받아들입니다.
use Saloon XmlWrangler XmlWriter ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [
' name ' => ' Sam ' ,
' twitter ' => ' @carre_sam ' ,
' facts ' => [
' favourite-song ' => ' Luke Combs - When It Rains It Pours '
],
]);
위의 코드는 다음 XML로 변환됩니다.
<? 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 >
XML을 작성할 때는 종종 요소의 속성 및 네임 스페이스를 정의해야합니다. XML 배열의 Element
클래스를 사용하여 속성 또는 네임 스페이스가있는 요소를 추가 할 수 있습니다. Element
클래스를 다른 배열 및 문자열 값과 혼합 할 수 있습니다.
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 ' ),
]);
이로 인해 다음 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 >
종종 요소 배열을 정의해야합니다. 단순히 값 또는 요소 클래스를 제공하여이를 수행 할 수 있습니다.
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 ' ),
],
],
]);
이로 인해 다음 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 >
때로는 루트 요소의 이름을 변경해야 할 수도 있습니다. 이것은 write
방법의 첫 번째 인수로 사용자 정의 할 수 있습니다.
$ xml = XmlWriter :: make ()-> write ( ' custom-root ' , [...])
루트 요소에 속성과 네임 스페이스를 추가하려면 여기에서도 RootElement
클래스를 사용할 수도 있습니다.
use Saloon XmlWrangler Data RootElement ;
$ rootElement = RootElement :: make ( ' root ' )-> addNamespace ( ' soap ' , ' http://www.w3.org/2003/05/soap-envelope ' );
$ xml = XmlWriter :: make ()-> write ( $ rootElement , [...])
cdata 태그를 추가 해야하는 경우 CDATA
클래스를 사용할 수 있습니다.
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! ' ),
]);
이로 인해 다음 XML이 발생합니다
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< root >
< name >Sam</ name >
< custom > <![CDATA[ Here is some CDATA content! ]]> </ custom >
</ root >
때로는 XML의 일부가있어 응용 프로그램에서 여러 XML 요청을 재사용 할 수 있습니다. XML Wrangler를 사용하면 응용 프로그램에서 재사용 할 수있는 클래스에서 XML 컨텐츠를 정의 할 수있는 "Composable"요소를 만들 수 있습니다. Element
클래스를 확장하고 보호 된 정적 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 ,
]);
이렇게하면 다음과 같이 XML이 발생합니다.
<? 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 >
기본 XML 인코딩은 utf-8
이고 XML의 기본 버전은 1.0
이고 기본값 독립형은 null
입니다 (XML Parsers는 독립형 속성을 false
와 동일하게 해석하지 않습니다). 이를 사용자 정의하려면 작가의 setXmlEncoding
, setXmlVersion
및 setXmlStandalone
메소드로 가능합니다.
use Saloon XmlWrangler XmlWriter ;
$ writer = new XmlWriter ();
$ writer -> setXmlEncoding ( ' ISO-8859-1 ' );
$ writer -> setXmlVersion ( ' 2.0 ' );
$ writer -> setXmlStandalone ( true );
// $writer->write(...);
XML 선언 <?xml version="2.0" encoding="ISO-8859-1" standalone="yes"?>
가 발생합니다.
addProcessingInstruction
메소드를 사용하여 XML에 사용자 정의 "처리 명령어"를 추가 할 수 있습니다.
use Saloon XmlWrangler XmlWriter ;
$ writer = new XmlWriter ();
$ writer -> addProcessingInstruction ( ' xml-stylesheet ' , ' type="text/xsl" href="base.xsl" ' );
$ xml = $ writer -> write ( ' root ' , [ ' name ' => ' Sam ' ]);
이로 인해 다음 XML이 발생합니다
<? xml version = " 1.0 " encoding = " utf-8 " ?>
<? xml-stylesheet type = " text/xsl " href = " base.xsl " ?>
< root >
< name >Sam</ name >
</ root >
기본적으로 XML이 작성된 XML은 조정되지 않았습니다. XML을 조정하기 위해 write
방법에 세 번째 인수를 제공 할 수 있습니다.
use Saloon XmlWrangler XmlWriter ;
$ xml = XmlWriter :: make ()-> write ( ' root ' , [...], minified: true );
XML Wrangler는 많은 레그 워크를 수행하는 두 가지 강력한 라이브러리 주변의 간단한 래퍼입니다. 두 라이브러리는 모두 환상적이며 별이 있습니다!