2013-03-28 8 views
6

Ich muss einige recht schwere XML-Dateien (zwischen 200 MB und 1 GB) lesen, die für einige von ihnen ungültig sind. Lassen Sie mich Ihnen ein kleines Beispiel:PHP - Lesen und Reparieren großer ungültiger XML-Dateien

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> 
    <item> 
    <title>Some article</title> 
    <g:material><ul><li>50 % Coton</li><li>50% Lyocell</li></g:material> 
    </item> 
</rss> 

Offensichtlich gibt es einen fehlenden </ul> schließenden Tag im g:material-Tag. Außerdem sollten Personen, die diesen Feed entwickelt haben, g:material Inhalt in CDATA beigefügt haben, was sie nicht taten ... Grundsätzlich möchte ich Folgendes tun: füge diesen fehlenden Abschnitt CDATA hinzu.

Ich habe versucht, einen SAX-Parser zu verwenden, um diese Datei zu lesen, aber es schlägt fehl, wenn das </g:material>-Tag gelesen wird, da das </ul>-Tag fehlt. Ich habe es mit XMLReader versucht, habe aber grundsätzlich das gleiche Problem. Ich könnte wahrscheinlich etwas mit DomDocument :: loadHtml tun, aber die Größe dieser Datei ist nicht wirklich kompatibel mit einem DOM-Ansatz. Haben Sie eine Idee, wie ich dieses Feed einfach reparieren könnte, ohne viel RAM für DomDocument zu kaufen? Danke.

+0

ja sollten sie es getan haben. Sie könnten immer versuchen, alle Dateien regexp zu finden/ersetzen, wenn Sie wissen, wo die Probleme liegen. aber es sollte dir nicht zuerst am Herzen liegen. – mpm

+0

Hey Rémi, kannst du die Zeichenfolge nicht lesen und daher die CDATA-Abschnitte hinzufügen, bevor du sie an deinen XML-Lader schiebst? – brisssou

+0

Ja, darüber habe ich nachgedacht und was ich gerade mache, aber ich hoffe immer noch, dass es besser ist zu denken, als XML-Zeichen für Zeichen zu lesen oder mit regexp zu finden/zu ersetzen :) – Remi

Antwort

3

Wenn die Dateien zu groß sind, um die Erweiterung Tidy zu verwenden, können Sie die Dateien tidy CLI tool verwenden, um die Dateien analysierbar zu machen.

$ tidy -output my.clean.xml my.xml 

Danach werden die XML-Dateien wohlgeformt, so dass Sie sie mit dem XMLReader analysieren kann. Da sauber die "fehlenden" (X) HTML-Teile hinzugefügt werden, befindet sich der Code Ihres Originaldokuments innerhalb des Elements.

+0

ops, können Sie Tidy Erweiterung für große Dateien verwenden (siehe meine Antwort unten). Und Sie können PHP als Befehl verwenden, um HTML-Dateien nach Terminal in XHTML umzuwandeln. –

0

(Kopie aus https://stackoverflow.com/a/17903058/287948)

als zwei Schritten zusammenfassend:

  1. Verwenden Tidy "freie HTML" in "gute XHTML" zu verwandeln.
  2. Verwenden XML Parser von SAX API XHTML als XML zu analysieren.

Verwenden erstes Tidy (!), "Freien HTML" in XHTML zu transformieren (oder wenn Sie Ihrem "sollte XHTML" nicht vertrauen). Siehe cleanRepair Methode. Es braucht mehr Zeit, aber läuft mit großen Dateien (!) ... Set some minutes as maximum execution time wenn zu groß.

Eine weitere Option (für die Arbeit mit großen Dateien) ist es, Ihre XHTML-Dateien zwischenzuspeichern, nachdem sie in XHTML geprüft oder umgewandelt wurden. Siehe Tidys repairfile Methode.

Mit einem "vertrauenswürdigen XHTML", verwenden Sie SAX ... Wie SAX mit PHP zu verwenden?

Parse XML mit einem SAX standard API wird, dass in PHP von LibXML implementiert (LibXML2 bei xmlsoft.org sehen), und seine Schnittstelle ist die PHP's XML Parser, das heißt in der Nähe des SAX Standard API.

Ein anderer Weg, um die „SAX von LibXML2“, mit einer anderen Schnittstelle (eine PHP iterator anstelle der traditionellen SAX-Schnittstelle), zu verwenden, ist XMLReader zu verwenden.Siehe this explanation about "XMLReader use SAX".


Ja, die Begriffe "SAX" oder "SAX-API" nicht in dem PHP-Handbuch zum Ausdruck (!). Siehe this old but good introduction.