Синтаксис обращения к элементам XML через SimpleXML (PHP)

323
09 января 2017, 23:59

В коде интернет-магазина есть фрагмент:

if (!file_exists($xml_file) || !$xml = @simplexml_load_file($xml_file)) {
        $this->errors[] = "cannot load";
        return false;
}
if (!$xml['version'] || !$xml['name']) {
    $this->errors[] = "version and name required";
    return false;
}

Пример обрабатываемого XML:

<?xml version="1.0" encoding="UTF-8" ?> 
<theme> 
	<version value="1.4"> 
		<ccc available="true" /> 
		<guest_checkout available="true" /> 
		<one_page_checkout available="true" /> 
		<store_locator available="true" /> 
	</version> 
	 
	<name value="Sound Theme" /> 
</theme>

Проблема в том, что условие (!$xml['version'] || !$xml['name']) возвращает false, несмотря на то, что элементы version и name в xml есть. Пробовал обращаться к ним в стиле $xml->{'version'} - все работает. Не может быть, что в таком крупном продукте неправильно написали код работы с XML. Может быть, доступ к элементам через синтаксис [] работает с определенной версии PHP? У меня версия 5.3.13. Прошу подсказать, в чем может быть проблема и как ее исправить, не меняя исходный код интернет-магазина.

Answer 1

Начнем с того что синтаксис $xml['version'] говорит о том, что у объекта $xml берется значение аттрибута. В вашем же $xml

<theme>
    <version value="1.4">
        <ccc available="true" />
        <guest_checkout available="true" />
        <one_page_checkout available="true" />
        <store_locator available="true" />
    </version>
    <name value="Sound Theme" />
</theme>

у корневого элемента theme этих аттрибутов нет. Потому то и не проходит проверка

!$xml['version'] || !$xml['name']

Для того чтобы разобраться, я скачал бесплатный шаблон для prestashop (вообще не знаю зачем). И в нем я увидел приблизительно следующее:

<theme version="1.0" name="dixio" directory="dixio">
    <author name="Presta Theme Maker" email="presta.theme.maker@gmail.com" url="http://presta-theme-maker.com/"/>

Видите? Здесь у тега theme есть оба проверяемых аттрибута.

Таким образом, вывод - предоставленный вами xml-файл имеет неподдерживаемый скриптом импорта/экспорта формат.

Answer 2

Попробуйте вот так. Надеюсь что помог

$xml->version[0]['value'];
READ ALSO
сохранение аудио потока в файл

сохранение аудио потока в файл

Используя эту технологию https://wwwmicrosoft

417
Отправка почтового сообщения

Отправка почтового сообщения

Почему выдаёт ошибку?

292
CURL и редирект [дубликат]

CURL и редирект [дубликат]

На данный вопрос уже ответили:

344