Jestem kompletnym edytorem Perla, ale jestem pewien, że uczenie się Perla będzie łatwiejsze niż ustalenie, jak parsować XML w awk. Chciałbym przeanalizować .sgm pliki z tego zestawu danych:Błąd analizatora przy użyciu modułu Perl XML :: DOM, "odwołanie do niepoprawnego numeru znaku"
http://kdd.ics.uci.edu/databases/reuters21578/reuters21578.html
Jest to zbiór artykułów z 20.000 Reuters Newswire z dziesięć lat temu, a to standardowy zestaw testowy dla niektórych rodzajów przetwarzania tekstu. Aby uprościć moje testowanie perl, chwyciłem pierwsze kilkaset wierszy z pierwszego pliku i wykonałem test.sgm, dopóki mój skrypt nie działał poprawnie. Zaczyna się tak:
<!DOCTYPE lewis SYSTEM "lewis.dtd">
<REUTERS TOPICS="YES" LEWISSPLIT="TRAIN" CGISPLIT="TRAINING-SET" OLDID="5544" NEWID="1">
<DATE>26-FEB-1987 15:01:01.79</DATE>
<TOPICS><D>cocoa</D></TOPICS>
<PLACES><D>el-salvador</D><D>usa</D><D>uruguay</D></PLACES>
<PEOPLE></PEOPLE>
<ORGS></ORGS>
<EXCHANGES></EXCHANGES>
<COMPANIES></COMPANIES>
<UNKNOWN>
C T
f0704reute
u f BC-BAHIA-COCOA-REVIEW 02-26 0105</UNKNOWN>
<TEXT>
<TITLE>BAHIA COCOA REVIEW</TITLE>
<DATELINE> SALVADOR, Feb 26 - </DATELINE><BODY>Showers continued throughout the week in
the Bahia cocoa zone, alleviating the drought since early
January and improving prospects for the coming temporao,...
użyłem skryptu perla z http://www.xml.com/pub/a/2001/05/16/perlxml.html jako przykład, a skończyło się na tym, extract.pl:
use XML::DOM;
my $file = $ARGV[0];
my $parser = XML::DOM::Parser->new();
my $doc = $parser->parsefile($file);
#print $doc->getElementsByTagName('DATE');
print "\n";
i uzyskać ten wynik:
> perl extract.pl test.sgm
reference to invalid character number at line 11, column 0, byte 343 at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/XML/Parser.pm line 187
>
Google nie pomaga (najlepsze trafienie wydaje się być stroną, na której występuje ten sam błąd), a mój przyjaciel hackera Perl nadal jest zawieszony w Blackhat w Vegas. Jakieś pomysły, co robię źle, albo jak mogę wyczyścić plik? Zakładam, że zło dzieje się wewnątrz tego tagu "Unknown", którego nawet nie potrzebuję. Naprawdę chcę tylko wyodrębnić tekst z każdego artykułu. Jeśli potrzebujesz więcej informacji, daj mi znać.
No cóż. Wygląda na to, że nie robię nic złego. Ponieważ nie tworzę pliku XML ani nie używam niepoprawnych znaków do niczego użytecznego, prosty ""// #/bad/g " cleantest.sgm Wygląda na to, że trzeba. Cóż, wciąż narzeka na "śmieci po elementach dokumentu na linii 72", ale to nie ma związku. Dziękujemy za wyśledzenie dla mnie tego archiwum XML. –
PlexLuthor