PHP: Як впоратися з <! [CDATA [з SimpleXMLElement?


97

Я помітив, що при використанні SimpleXMLElementв документі, який містить ці теги CDATA, вміст є завжди NULL. Як це виправити?

Також вибачте за спам про XML тут. Я вже кілька годин намагаюся змусити сценарій на основі XML працювати ...

<content><![CDATA[Hello, world!]]></content>

Я спробував перше звернення в Google, якщо ви шукали "SimpleXMLEleda cdata", але це не вийшло.


Як ви намагаєтеся отримати доступ до значення вузла? І чи є SimpleXML вимогою?
allnightgrocery

Я спробував будь-яку іншу функцію (xml2array і все), яку я міг знайти в Інтернеті, а SimpleXML, здається, є єдиною, яка дає добрі результати, за винятком того, що CDATA не працює.
Анджело

1
Ми робимо багато аналізу XML на роботі за допомогою DOMDocument ( php.net/manual/en/class.domdocument.php ). Це добре працює з обробкою CDATA. Надайте цей короткий або опублікуйте трохи більше коду для нас, щоб побачити, як ви працюєте з SimpleXML.
allnightgrocery

Відповіді:


182

Ви, мабуть, не правильно отримуєте доступ до нього. Ви можете виводити його безпосередньо або передавати у вигляді рядка. (у цьому прикладі кастинг є зайвим, оскільки відлуння автоматично робить це все одно)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
);
echo (string) $content;

// or with parent element:

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>'
);
echo (string) $foo->content;

Можливо, вам пощастить LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>'
    , null
    , LIBXML_NOCDATA
);

2
Ні, PHP чомусь повністю пропускає CDATA. Будь-які інші ідеї?
Анджело

4
Тоді це помилка. Оновіть PHP / libxml, поки він не працює (я ніколи не мав жодних проблем із CDATA та SimpleXML.) Ви, можливо, захочете спробувати свою удачу з LIBXML_NOCDATA в іншому випадку.
Джош Девіс

5
Я знаю, що це стара відповідь, але я хотів би підкреслити, що перша частина цієї відповіді правильна . Коли ви друкуєте результат разом із собою, print_rви дійсно не отримуєте до нього правильного доступу. Напишіть код, який ви насправді хочете - напевно echo, з (string)актором, або ви побачите, що вміст добре. Не використовуйте LIBXML_NOCDATA, це не має значення.
IMSoP

7
@IMSoP Додавання LIBXML_NOCDATA (і нічого іншого не змінюється) працює, тому я не дуже впевнений, що це не має значення.
rand

3
@SimonePalazzo XML складається з різних різних "вузлів" - наприклад <anElement>a text node <aChildElement /> <![CDATA a cdata node]]> another text node</anElement>. CDATA та текстові вузли бувають різних типів, а SimpleXML відстежує це, щоб ви могли повернути вкладений XML. Коли ви стискаєте об’єкт SimpleXML в масив, він викидає багато інформації - CDATA-вузли, коментарі, будь-який елемент не у поточному просторі імен (наприклад <someNSPrefix:someElement />) положення дочірнього елемента в тексті тощо LIBXML_NOCDATAперетворює CDATA-вузли в текстові, але не фіксує решти.
IMSoP

48

LIBXML_NOCDATAЄ необов'язковим третім параметром simplexml_load_file()функції. Це повертає об’єкт XML з усіма даними CDATA, перетвореними в рядки.

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);
echo "<pre>";
print_r($xml);
echo "</pre>";


Виправити CDATA у SimpleXML


LIBXML_NOCDATA - це те, що змусило цю роботу для мене. PHP 5.3.5
Mike_K

1
Ваша відповідь - це пояснення значення LIBXML_NOCDATA , дякую!
Marcio Mazzucato

14

Це зробило для мене трюк:

echo trim($entry->title);

Ідеально, якщо вам потрібно зберегти дані (без LIBXML_NOCDATA)
maztch


0

Коли користуватися LIBXML_NOCDATA?

Я додаю проблему при перетворенні XML в JSON.

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo json_encode($xml, true); 
/* prints
   {
     "content": {}
   }
 */

Під час доступу до об'єкта SimpleXMLElement, він отримує CDATA:

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>");
echo $xml->content; 
/* prints
   Hello, world!
*/

Я має сенс використовувати, LIBXML_NOCDATAтому json_encodeщо не отримуйте доступу до SimpleXMLElement, щоб запустити функцію кастингу рядків, я здогадуюсь про __toString()еквівалент.

$xml = simplexml_load_string("<foo><content><![CDATA[Hello, world!]]></content></foo>", null, LIBXML_NOCDATA);
echo json_encode($xml);
/*
 {
   "content": "Hello, world!"
 }
*/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.