У меня возникли проблемы с чтением атрибутов из API Spreadshirt с помощью SimpleXML. Я не могу захватить атрибут xlink: href из ресурсов, который мне нужен, поскольку он не отображается в полученных данных. Похоже, уметь хватать все остальное.
Это XML, который я читаю:
<articles xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://api.spreadshirt.net" xlink:href="http://api.spreadshirt.net/api/v1/shops/800323/articles?fullData=true" offset="0" limit="50" count="16" sortField="default" sortOrder="default">
<article isDuplicate="false" xlink:href="http://api.spreadshirt.net/api/v1/shops/800323/articles/100402428" id="100402428">
<name>Hammer T-Shirt</name>
<price>
<vatExcluded>13.33</vatExcluded>
<vatIncluded>16.00</vatIncluded>
<vat>20.00</vat>
<currency xlink:href="http://api.spreadshirt.net/api/v1/currencies/2" id="2"/>
</price>
<resources>
<resource mediaType="png" type="preview" xlink:href="http://image.spreadshirt.net/image-server/v1/products/125642560/views/1"/>
</resources>
</article>
</atricles>
Это данные, возвращаемые с SimpleXML:
SimpleXMLElement Object
(
[@attributes] => Array
(
[isDuplicate] => false
[id] => 27368595
)
[name] => Hammer Boxers
[price] => SimpleXMLElement Object
(
[vatExcluded] => 10.00
[vatIncluded] => 12.00
[vat] => 20.00
[currency] => SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 2
)
)
)
[resources] => SimpleXMLElement Object
(
[resource] => SimpleXMLElement Object
(
[@attributes] => Array
(
[mediaType] => png
[type] => preview
)
)
)
)
У кого-нибудь есть идеи? Я в тупике.
isDuplicate
и id
находятся в том же пространстве имен, что и элемент.
Элемент href
находится в пространстве имен http://www.w3.org/1999/xlink
, как указано префиксом xlink
, зарегистрированным в корневом элементе <articles>
.
Чтобы получить доступ ко всем элементам пространства имен, вызовите $element->attributes('http://www.w3.org/1999/xlink')
.
Идея состоит в том, что корневой элемент мог бы вместо этого сказать xmlns:foobar="http://www.w3.org/1999/xlink"
, и каждый <article>
имел бы атрибуты foobar:href="..."
и код выше все равно будет работать, потому что связанный префикс является лишь способом улучшения удобочитаемости. Что такое URL-адрес пространства имен, а не его префикс.
->asXML('php://output')
для объекта SimpleXMLElement , не используйтеprint_r
илиvar_dump
, эти функции скрывают данные любого объекта.