2017-01-27 4 views
0

Я знаю. Это недействительный XML.libxml проанализировать все содержимое, если имеется несколько корневых узлов

К сожалению, это часть работы, связанной с ошибкой в ​​исходном коде php, которая использует libxml.

Функция Php loadHTML перезаписывает предупреждения и ошибки ошибок, поэтому, если вы передадите эти параметры, они никогда не попадают в libxml.

Нагрузка PhpXML не сделать ту же ошибку. Все флаги работают так, как ожидалось. Поэтому я изучаю использование loadXML в качестве замены на данный момент. К сожалению loadXML не подходит для загрузки, скажем, фрагментов шаблонов или виджетов, потому что он остановит разбор после одного корневого узла. Так что-то вроде ....

<!--My title snippet --> 
<h1>${{ title }}</h1> 
<h4>${{ subtitle }}</h4> 

будет частично загружен loadXML. Есть ли какой-либо флажок опции, чтобы заставить парсер libxml продолжать работу?Или мне придется потребовать, чтобы все фрагменты были обернуты в корневой узел?

Примечание

Я исследовал другие способы обойти ошибку. Например, с помощью LIBXML_USE_INTERNAL_ERRORS (true) или путем улавливания и очистки предупреждений с выходным буфером. Оба работают, но ни один из них не является удовлетворительным, поскольку они пишут предупреждения и ошибки в память, которые я не хочу.

+0

В чем проблема с 'libxml_use_internal_errors'? Предупреждения и ошибки можно очистить с помощью 'libxml_clear_errors'. – nwellnhof

ответ

1

Соответствие Функция libxml2: xmlParseBalancedChunkMemory. Единственное место, где я могу найти, где эта функция открыто опознает PHP API, - DOMDocumentFragment::appendXML.

$doc = new DOMDocument(); 
$fragment = $doc->createDocumentFragment(); 
$fragment->appendXML('<h1>H1</h1><h4>H4</h4>'); 
print $doc->saveXML($fragment); 

Но если вы пытаетесь разобрать HTML, вы, вероятно, столкнетесь с неприятностями.

+0

и, конечно, другие варианты синтаксического анализа недоступны на appendXML. Дождитесь полного распространения php-патча. – user2782001