Zanurkuj w Pythonie/Abstrakcyjne źródła wejścia: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
Nie podano opisu zmian
Piotr (dyskusja | edycje)
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.
In case you were wondering how this relates to XML processing, minidom.parse is one such function which can take a file-like object.
 
'''Przykład 10.1. Parsowanie XML-u z pliku'''
 
<nowiki>
Linia 35:
</nowiki>
 
# Najpierw otwieramy plik z dysku. Otrzymujemy przez to obiekt pliku.
# First, you open the file on disk. This gives you a file object.
# YouPrzekazujemy passobiekt thepliku file object todo <tt>minidom.parse</tt>, whicha callsktóry thewywołuje metodę <tt>read</tt> method ofz <tt>fsock</tt> andi readsczyta thedokument XML document from the filez ontego diskpliku.
# BeKoniecznie surewywołujemy to call themetodę <tt>close</tt> methodz ofobiektu thepliku, filejak objectjuż afterskończyliśmy you'rena donenim with itpracę. <tt>minidom.parse</tt> will notnie dozrobi thistego forza younas.
# Wywołując metodę <tt>toxml()</tt> ze zwróconego dokumentu XML, wypisujemy cały dokument.
# Calling the toxml() method on the returned XML document prints out the entire thing.
 
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.
Well, that all seems like a colossal waste of time. After all, you've already seen that minidom.parse can simply take the filename and do all the opening and closing nonsense automatically. And it's true that if you know you're just going to be parsing a local file, you can pass the filename and minidom.parse is smart enough to Do The Right Thing™. But notice how similar -- and easy -- it is to parse an XML document straight from the Internet.
 
'''ExamplePrzykład 10.2. ParsingParsowanie XML-a fromz URL-a URL '''
 
<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.
# As you saw in a previous chapter, urlopen takes a web page URL and returns a file-like object. Most importantly, this object has a read method which returns the HTML source of the web page.
# 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.
# Now you pass the file-like object to minidom.parse, which obediently calls the read method of the object and parses the XML data that the read method returns. The fact that this XML data is now coming straight from a web page is completely irrelevant. minidom.parse doesn't know about web pages, and it doesn't care about web pages; it just knows about file-like objects.
# Jak tylko obiekt pliko-podobny, który podarował nam <tt>urlopen</tt>, nie będzie potrzebny, koniecznie zamykamy go.
# As soon as you're done with it, be sure to close the file-like object that urlopen gives you.
# 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].
# By the way, this URL is real, and it really is XML. It's an XML representation of the current headlines on Slashdot, a technical news and gossip site.
 
'''ExamplePrzykład 10.3. ParsingPrzetwarzania XML-a fromz ałańcucha stringznaków (theprosty easysposób, butale inflexiblemało wayelastyczny)'''
 
<nowiki>
Linia 89:
</nowiki>
 
# <tt>minidom</tt> hasposiada a method,metodę <tt>parseString</tt>, whichktóra takesprzyjmuje ancały entiredokument XML documentw aspostaci ałańcucha stringznaków andi parsesparsuje itgo. YouMożesz can usewykorzystać, this instead ofzamiast <tt>minidom.parse</tt>, ifjeśli youwiesz, knowże youposiadasz alreadycały have your entire XMLdokument documentw informie ałańcucha stringznaków.
 
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()