2013-03-28 20 views
6

Mam do przeczytania dość ciężkie pliki XML (od 200 MB do 1 GB), które dla niektórych z nich są nieprawidłowe. Podam mały przykład:PHP - Odczyt i naprawa dużych niepoprawnych plików XML

<?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> 

Oczywiście, istnieje brakuje </ul> zamknięcia tag w tagu g:material. Co więcej, ludzie, którzy rozwinęli ten kanał, powinni mieć załączoną treść do CDATA, której nie zrobili ... W zasadzie to właśnie chcę zrobić: dodaj tę brakującą sekcję CDATA.

Próbowałem użyć parser SAX do odczytu tego pliku, ale nie powiedzie się, czytając tag </g:material>, ponieważ brakuje tagu </ul>. Próbowałem z XMLReader, ale w zasadzie ten sam problem. Prawdopodobnie mógłbym zrobić coś z DomDocument :: loadHtml, ale rozmiar tego pliku nie jest tak naprawdę zgodny z podejściem DOM. Czy masz pojęcie, jak mogę po prostu naprawić ten plik bez konieczności kupowania dużej ilości pamięci RAM, aby działał DomDocument? Dzięki.

+0

Tak, powinni byli to zrobić. zawsze możesz spróbować ponownie wyszukać/zamienić wszystkie pliki, jeśli wiesz, gdzie są problemy. ale na początku nie powinno to stanowić twojego problemu. – mpm

+0

Hej, Remi, czy nie potrafisz odczytać napisu, dodając do tego sekcje CDATA, zanim wepchniesz je do swojego programu ładującego XML? – brisssou

+0

Tak, właśnie o tym myślałem i co teraz robię, ale nadal mam nadzieję, że jest lepsze myślenie niż czytanie XML-a przez znak lub znajdowanie/zamiana za pomocą regexp :) – Remi

Odpowiedz

3

Jeśli pliki są zbyt duże, aby można było korzystać z rozszerzenia Tidy, można użyć pliku tidy CLI tool, aby pliki były parsowane.

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

Po tym pliki XML są dobrze uformowane, więc można je analizować za pomocą XMLReader. Ponieważ tidy dodaje "brakujące" (X) części HTML, kod twojego oryginalnego dokumentu znajduje się wewnątrz elementu.

+0

ops, możesz użyć rozszerzenia Tidy dla dużych plików (zobacz moją odpowiedź poniżej). I możesz użyć PHP jako polecenia do transformacji plików HTML na XHTML przez terminal. –

0

(przepisać z https://stackoverflow.com/a/17903058/287948)

Podsumowując jak dwóch etapach:

  1. Zastosowanie Tidy przekształcić HTML "wolny" na "dobry" XHTML.
  2. Użyj Parser XML do parsowania XHTML jako XML przez SAX API.

pierwszego użycia Tidy (!), Aby przekształcić "wolny" HTML do XHTML (lub gdy nie można zaufać "niby XHTML"). Zobacz metodę cleanRepair. Potrzebuje więcej czasu, ale działa z dużymi plikami (!) ... Set some minutes as maximum execution time jeśli jest za duży.

Inną opcją (w przypadku pracy z dużymi plikami) jest buforowanie plików XHTML po sprawdzeniu lub przekształceniu w XHTML. Zobacz metodę Tidy'ego: repairfile.

Z "zaufanym XHTML", używać SAX ... Jak korzystać z SAX z PHP?

składni XML z SAX standard API, że w PHP jest realizowany przez LibXML (patrz libxml2 na xmlsoft.org), a jego interfejs jest PHP's XML Parser, że jest blisko do SAX standardowego API.

Innym sposobem wykorzystania „SAX libxml2” z innego interfejsu (A PHP iterator zamiast tradycyjnego interfejsu SAX) jest użycie XMLReader.Zobacz this explanation about "XMLReader use SAX".


Tak, pojęcia "SAX" lub "SAX API" nie zostały wyrażone w instrukcji PHP (!). Zobacz this old but good introduction.

Powiązane problemy