2013-02-28 4 views
7

Я бы хотел использовать PHP Tidy, чтобы гарантировать, что мой xml действителен, прежде чем загружать его в DomDocument.PHP Tidy удаляет пробелы и вставляет новые строки

Однако, я не хочу Tidy, чтобы изменить что-то к моему форматированию - Я только хочу, чтобы это исправить проблемы, как несбалансированные теги и т.д.

Пример задачи можно увидеть на этой странице: http://www.tek-tips.com/viewthread.cfm?qid=1654452

Мой собственный пример следующий.

Вход: <ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex> (который действует XML уже)

Ожидаемый результат: <ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex> (есть нарушение пробельные между </context> и актион)

Фактический выход:

<ex> 
<context>собр 
<stress>а</stress>ние</context>акцион 
<stress>е</stress>ров — 
<stress>aa</stress>ndeelhoudersvergadering</ex> 

(она была удалена пробел между </context> и актион, который сделает текст нечитаемым, и он вставил новый строки после каждого тега)

Мой код:

function TidyXml($inputXml) 
    { 
     $config = array(
      'indent'   => false, 
      'output-xml'  => true, 
      'input-xml'  => true, 
     ); 

     $tidy = new tidy(); 
     $tidy->parseString($inputXml, $config, 'utf8'); 
     $tidy->cleanRepair(); 
     $cleanXml = tidy_get_output($tidy); 
     return $cleanXml; 
    } 

Я попытался изменить несколько вариантов, но это не удалось.

+0

Http: // аккуратным. sourceforge.net/docs/quickref.html#output-xml – hakre

+0

PHP Простой HTML DOM Parser является гораздо более мягким парсером, чем большинство. http://simplehtmldom.sourceforge.net/ – Petah

+0

@hakre Я удалил все настройки, кроме '' input-xml '=> true' (необходимо, потому что иначе он выведет полный HTML-документ). Однако это не помогло. Также я попытался установить '' output-xml '=> false', но это не помогло. Можно ли что-то сделать для предотвращения зачистки/обрезки и форматирования? –

ответ

2

Я нашел решение, но оно немного хакерское, поэтому я все еще открыт для лучших предложений.

Поместите <pre> вокруг XML, который хочет проверить (это инструктирует Tidy не менять пробела), затем восстановить XML с выходным HTML установлены так, то удалите <pre> и \n новой строки.

Пример:

$config = array(
    'indent' => false, 
    'indent-attributes' => false, 
    'output-html' => true, 
    'input-xml' => true, 
    'wrap' => 0, 
    'vertical-space' => false, 
    'new-inline-tags' => 'context,abr,stress', 
    'new-blocklevel-tags' => 'def,ex,examples' 
); 

$tidy = new tidy(); 
$inputXml = "<pre>" . $inputXml . "</pre>"; 
$validXml = $tidy->repairString($inputXml, $config, 'utf8'); 
$cleanXml = str_replace("\n", "", $validXml); 
$cleanXml = substr($cleanXml, strlen("<pre>"), strlen($cleanXml)); 
$cleanXml = substr($cleanXml, 0, strlen($cleanXml)-strlen("</pre>")); 
0

В моем случае, я был в состоянии запустить заменить на HTML, чтобы удалить несколько пустых строк и предотвратить Tidy от добавления Разрывы $html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);

Смежные вопросы