Zanurkuj w Pythonie/Abstrakcyjne źródła wejścia: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 12:
Powyżej opisaliśmy, w jaki sposób działają prawdzie pliki. Różnica jest taka, że nie musimy się ograniczać do prawdziwych plików. Źródłem wejścia może być wszystko: plik na dysku, strona internetowa, czy nawet jakiś łańcuch znaków. Dopóki przekazujesz do funkcji obiekt przypominający obiekt pliku, a funkcja po prostu wywołuje metodę <tt>read</tt>, to funkcja ta może obsłużyć dowolny rodzaj wejścia, bez posiadania jakiegoś specjalnego kodu dla każdego rodzaju wejścia.
Może się zastanawiasz, co ma to wspólnego z przetwarzaniem XML-a? Otóż <tt>minidom.parse</tt> jest taką funkcji, do której możemy przekazać obiekt podobny do obiektu pliku.
'''Przykład 10.1. Parsowanie XML-u z pliku'''
<nowiki>
Linia 35:
</nowiki>
# Najpierw otwieramy plik z dysku. Otrzymujemy przez to obiekt pliku.
#
#
# Wywołując metodę <tt>toxml()</tt> ze zwróconego dokumentu XML, wypisujemy cały dokument.
Dobrze, to wszystko wygląda jak kolosalne marnotrawstwo czasu. Mimo wszystko, już widzieliśmy, że <tt>minidom.parse</tt> może po prostu przyjąć jako argument nazwę pliku, a który otwiera i zamyka automatycznie. I to jest prawdą, że jeśli chcesz parsować lokalny plik, możesz przekazać nazwę pliku, a <tt>minidom.parse</tt> będzie umiał mądrze to wykorzystać. Lecz zauważmy, że jest łatwo także parsować dokumenty XML prosto z Internetu.
'''
<nowiki>
Linia 74:
</nowiki>
# Jak już zaobserwowaliśmy w poprzednim rozdziale, <tt>urlopen</tt> przyjmuje adres URL strony internetowej i zwraca obiekt podobny do obiektu pliku. Ponadto, co jest bardzo ważne, obiekt ten posiada metodę <tt>read</tt>, która zwraca źródło danej strony internetowej.
# Teraz przekazujemy ten obiekt pliko-podobny do <tt> minidom.parse, który posłusznie wywołuje metodę <tt>read</tt> i parsuje dane XML, które zostają zwróconę przez <tt>read</tt>. Fakt, że te dane przychodzą teraz z bezpośrednio internetu, jest kompletnie nie związany z tematem. <tt>minidom.parse</tt> nie ma o stronach internetowych żadnego pojęcia; on tylko wie coś o obiektach pliko-podobnych.
# Jak tylko obiekt pliko-podobny, który podarował nam <tt>urlopen</tt>, nie będzie potrzebny, koniecznie zamykamy go.
# Przy okazji, ten URL jest prawdziwy i on naprawdę jest dokumentem XML. Reprezentuje on aktualne nagłówki i techniczne newsy i plotki w [http://slashdot.org/ Slashdot].
'''
<nowiki>
Linia 89:
</nowiki>
# <tt>minidom</tt>
OK, so you can use the minidom.parse function for parsing both local files and remote URLs, but for parsing strings, you use... a different function. That means that if you want to be able to take input from a file, a URL, or a string, you'll need special logic to check whether it's a string, and call the parseString function instead. How unsatisfying.
Linia 125:
>>> contents = "<grammar><ref id='bit'><p>0</p><p>1</p></ref></grammar>"
>>> ssock = StringIO.StringIO(contents)
>>> xmldoc = minidom.parse(ssock) #(1)
>>> ssock.close()
>>> print xmldoc.toxml()
|