2013-02-28 6 views
7

Ich möchte PHP Tidy verwenden, um sicherzustellen, dass mein XML gültig ist, bevor ich es in ein DomDocument lade.PHP Tidy entfernt Leerzeichen und fügt Zeilenumbrüche ein

aber ich weiß nicht Tidy will etwas meine Formatierung ändern - ich will es nur Probleme wie unausgeglichen Tags reparieren usw.

Ein Beispiel für das Problem kann auf dieser Seite zu sehen: http://www.tek-tips.com/viewthread.cfm?qid=1654452

Mein eigenes Beispiel ist das folgende.

Input: <ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex> (die bereits gültige XML ist)

Erwartete Ausgabe: <ex><context>собр<stress>а</stress>ние</context> акцион<stress>е</stress>ров — <stress>aa</stress>ndeelhoudersvergadering</ex> (es gibt zu brechen Leerzeichen zwischen </context> und актион)

tatsächliche Ausgang:

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

(es entfernt der Abstand zwischen </context> und актион, der den Text unlesbar machen wird, und es neu eingefügt nach jedem Tag Linien)

Mein Code ist:

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; 
    } 

ich mehrere Möglichkeiten versucht, zu ändern, aber nicht gelang.

+0

http: // ordentlich. sourceforge.net/docs/quickref.html#output-xml – hakre

+0

PHP Einfacher HTML-DOM-Parser ist ein viel milderer Parser als die meisten anderen. http://simplethmdom.sourceforge.net/ – Petah

+0

@hakre Ich habe alle Einstellungen außer '' input-xml '=> true' entfernt (benötigt, da sonst ein komplettes HTML-Dokument ausgegeben wird). Es hat jedoch nicht geholfen. Ich habe auch versucht, '' output-xml '=> false' zu setzen, aber das hat nicht geholfen. Kann etwas unternommen werden, um Abstreifen/Trimmen und Formatieren zu verhindern? –

Antwort

2

Ich fand eine Lösung, aber es ist ein bisschen hackish, also bin ich noch offen für bessere Vorschläge.

Put <pre> um die xml Sie validieren möchten (Tidy dies weist den Leerzeichen nicht zu ändern), dann reparieren xml mit Ausgabe-html auf true gesetzt, dann die <pre> und \n Zeilenumbrüche entfernen.

Beispiel:

$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

In meinem Fall konnte ich einen Ersatz auf der HTML ausführen, um die mehrere Leerzeilen zu entfernen und zu verhindern, Tidy aus der Addition der Pausen $html = preg_replace("/\n([\s]*)\n/", "\r\n", $html);