Как получать DOM объекты из xml

173
19 декабря 2016, 19:33

Есть .XML : <xml><at><file><a href='11'>Текст</a></file></at></xml>

Получаю так $xml->file

Выводит ничего, либо чистый текст в некоторых случаях.

Необходимо же получить все,ничего не теряя. Простыми словами, получать как текст и отдавать браузеру...

Загружаю через simplexml_load_file().Так удобнеё в разы. Могу доставать любой текст с любых узлов, но при доставании DOM - проблема.

Answer 1

Давайте разберемся по шагам. Конечная наша цель, это отобразить ссылку из XML именно в таком виде, в котором она там представлена.

1) Раз вы пытались сделать это через simplexml_load_file - начнем с него

Имея изначальную структуру xml в виде

<xml>
    <at>
        <file>
            <a href='11'>Текст</a>
        </file>
    </at>
</xml>

и при загрузке её в переменную, допустим $xml = simplexml_load_file($someXMLfile), мы действительно ничего не увидим, обращаясь так: $xml->file. Просто потому, что, как минимум, перед узлом file у нас есть еще узел at.

Если мы напишем

echo '<pre>';
print_r($xml);
echo '</pre>';

То увидим структуру:

SimpleXMLElement Object
(
    [at] => SimpleXMLElement Object
        (
            [file] => SimpleXMLElement Object
                (
                    [a] => Текст
                )    
        )    
)

Что и логично (Мы не видим в структуре слова xml потому, что это корень элемента и $xml указывает на него в итоге).

Значит, чтобы добраться до узла file нужно, как минмум, обращаться вот так:

$xml->at->file, а добраться до ссылки: $xml->at->file->a.

Чтобы посмотреть аттрибуты узла, можно воспользоваться функцией attributes(). Например вот мы посмотрим атрибуты узла a;

echo '<pre>';
print_r($xml->at->file->a->attributes());
echo '</pre>';

Получим:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [href] => 11
        )    
)

В итоге для того, чтобы получить нам ровно такую же ссылку, как в XML, нам нужно самим сформировать эту ссылку, добавляя при этом в нужные места текст и значение атрибута из XML. В итоге получим в файле php:

<?php
    $link = $xml->at->file->a;
?>
<a href="<?php echo $link->attributes()->href; ?>"><?php echo $link; ?></a>
<?php
 // какой-то еще код 
?>

Лично для меня это более наглядный, т.к. понятно что и откуда мы берем.

2) Способ разбора, используя SimpleXMLElement, следуя его документации

Тут все просто:

// загружаем xml
$file = "<xml><at><file><a href='http://test.ru' id='test'>Текст</a></file></at></xml>";
// Создаем объект из файла 
$xml = new SimpleXMLElement($file);
// обращаемся к нужному узлу и применяем asXML();
// asXML- Возвращает сформированный XML документ в виде строки используя SimpleXML элемент
echo $xml->at->file->a->asXML();

Если ссылок много, то, можно обращаться по индексу (или можно перебрать в цикле):

$file = "<xml><at><file><a href='http://test.ru' id='test'>Текст</a><a href='http://test2.ru' id='test'>Текст2</a></file></at></xml>";
$xml = new SimpleXMLElement($file);
echo $xml->at->file->a[1]->asXML();

Выбирайте.

ВАЖНО! Не забывайте. Вы ВСЕГДА можете посмотреть структуру вашей XML используя var_dump или print_r(). Пример

var_dump($xml)

или

echo '<pre>';
print_r($xml);
echo '</pre>';
READ ALSO
Yii 2 urlManager

Yii 2 urlManager

Как можно настроить urlManager, чтобы ссылка http://advanced1/category/ua1-1 обрабатывалась actionIndex, притом последний параметр "ua1-1" может быть какой угодно например:...

266
Как работают функции fputcsv, fgetcsv?

Как работают функции fputcsv, fgetcsv?

Обе функции fputcsv и fgetcsv работают со строкамиЧитают/пишут по одной строке, т

257
Убрать день из интервала

Убрать день из интервала

Интервал взят из текстового бокса в определенном форматеБеру начало и конец интервала

182
Правильное наследование классов в php

Правильное наследование классов в php

Есть к примеру 3 класса

183