2016-01-14 3 views
1
simplexml_load_file($htmlstring) 

Это мое простое извлечение из базы данных сторонних разработчиков. Мы начали вытаскивать раздел комментариев, который, к сожалению, содержит & и несколько <, который поддерживает сборку xml. Ошибка:Как я могу избежать данных, поступающих из simplexml_load_file

Unescaped '&lt;' not allowed in attributes values 

Как я могу добраться до тех неправильно отформатированных результатов и CDATA их или что-то, прежде чем он пытался построить набор XML. Я просмотрел все http://php.net/manual/en/function.simplexml-load-file.php, но, похоже, у вас нет умных решений, чтобы найти решение!

ответ

1

Если входной файл недействителен, и вы не можете повлиять на его сторонних разработчиков, ваши варианты ограничены.

Чтобы загрузить файл, нужно использовать DOM in HTML mode. Это использует более прощающий парсер, но затем создает ту же структуру данных.

Приятно, что вам фактически не нужно использовать DOM со всей его многословием, потому что вы can "import" the DOM object into SimpleXML. Это не требует повторного анализа, поскольку оба интерфейса используют одни и те же структуры данных внутри (libxml).

Оттуда - при условии, что это сработало - вы можете продолжать, как если бы вы только запустили simplexml_load_file.

Таким образом, вместо этого:

$sxml = simplexml_load_file($file_path); 

Вы бы написать это:

$dom = DOMDocument::loadHTMLFile($file_path); 
$sxml = simplexml_import_dom($dom); 

Затем продолжать, как вы были.

(Если у вас есть строка данных, а не путь к файлу, вы бы с помощью simplexml_load_string() и DOMDocument::loadHTML() соответственно.)

+0

Спасибо, так, чтобы быть ясно, вы думаете, я могу схватить его, создавая файл локально с ним, скраб, а затем продолжить с моим simplexml_load_file с теперь чистым локальным файлом? – jeynon

+0

@jeynon Не так сложно, как это; см. пример кода, который я только что добавил в ответ – IMSoP