python and xml

apostolos_ | Δευ, 08/10/2009 - 18:35 | 6' | 5

Εχω το ακόλουθο xml αρχειο

 


 




<Collection>

<Book> <title>Dracula</title> <author>Brahm Stocker</author> <publisher>New England Publishing org.</publisher> <type>Novell</type>
<chapter title="Twilight">
<sub-chapter>intro</sub-chapter>
<sub-chapter>mina harker</sub-chapter>
</chapter>
</Book>
</Collection>


και προσπαθώ να το διαβάσω με ένα πρόγραμμα σε python χρησιμοποιώντας το sax module(xml.sax
)

Ο κώδικας είναι ο εξής

 

from xml.sax.handler import ContentHandler
from xml.sax import make_parser

class myXmlHandler(ContentHandler):
    inBook = 0
    inTitle = 0
    inAuthor = 0
    inPublisher = 0
    inType = 0
    inChapter = 0
    insubChapter = 0
    chapTitle = ''
   
    def startElement(self,name, attrs):
        if name == "Book":
            print "Turning on book flag"
            self.inBook = 1
        elif name == "title":
            print "Turning on title flag"
            self.inTitle = 1
        elif name == "author":
            print "Turning on author flag"
            self.inAuthor = 1
        elif name == "publisher":
            print "Turning on publisher flag"
            self.inPublisher =1
        elif name == "type":
            print "Turning on type flag"
            self.inType = 1
        elif name == "chapter":
            print "Turning on chapter flag"
            self.inChapter = 1
            self.chapTitle = attrs.get("title","")
        elif name == "sub-chapter":
            print "Turning on sub-chapter flag"
        #self.inChapter = 0
            self.insubChapter = 1
        print "Chapter flag turned off"
           
    def characters(self, characters):
        if self.inTitle:
            print "Title of the book is: "+characters
        elif self.inAuthor:
            print "Author: "+characters
        elif self.inPublisher:
            print "Publisher: "+ characters
        elif self.inType:
            print "Type"+characters
        elif self.inChapter:
            if self.insubChapter:
                print "Sub-chapter Title: " + characters
        else:
                print "Chapter Title" + self.chapTitle
       
      
   
    def endElement(self,name):
        if name == "Book":
            print "Turning off book flag"
            self.inBook = 0
        elif name == "title":
            print "Turning off title flag"
            self.inTitle = 0
        elif name == "author":
            print "Turning off author flag"
            self.inAuthor = 0
        elif name == "publisher":
            print "Turning off publisher flag"
            self.inPublisher =0
        elif name == "type":
            print "Turning off type flag"
            self.inType = 0
        elif name == "chapter":
            print "Turning off chapter flag"
            self.inChapter = 0
        elif name == "sub-chapter":
            print "Turning off sub-chapter flag"
            self.insubChapther = 0
           

if __name__ == "__main__":
    ch = myXmlHandler( )
    saxparser = make_parser( )
    saxparser.setContentHandler(ch)
    saxparser.parse("Collection.xml")
</code>

 

Το θέμα είναι ότι στην εκτύπωση του κειμένου ανάμεσα στα tags μου βγάζει αυτό το περίεργο αποτέλεσμα

Turning on book flag
Turning on title flag
Title of the book is: Dracula
Turning off title flag
Turning on author flag
Author: Brahm Stocker
Turning off author flag
Turning on publisher flag
Publisher: New England Publishing org.
Turning off publisher flag
Turning on type flag
TypeNovell
Turning off type flag
Turning on chapter flag
Chapter TitleTwilight
Turning on sub-chapter flag
Chapter flag turned off
Sub-chapter Title: intro
Turning off sub-chapter flag
Sub-chapter Title:

Turning on sub-chapter flag
Chapter flag turned off
Sub-chapter Title: mina harker
Turning off sub-chapter flag
Sub-chapter Title:

Turning off chapter flag
Turning off book flag

δηλαδή αν παρατηρείστε διαβάζει και εκτυπώνει κενό κείμενο στο sub-chapter tag...Τι ακριβώς είναι λάθος?

 sorry για την κακή μορφοποιηση κάτι έκανα λάθος

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Απ' όσο ξέρω η Python τυπώνει με τη μορφή print ("...")

Θέλει δηλαδή τις παρενθέσεις.

Ετσι όπως το έχεις σου "πετάει" το script στην οθόνη κι όχι τα αποτελέσματα του script.

Το κενό μπορεί να οφείλεται στο οτι δεν βρίσκει κάποιο title, ή μπορεί να βρίσκει κάποιον χαρακτήρα που να του ορίζει να αφήσει μια γραμμή.

 

Η python τυπωνει το αποτελεσμα με print "Hello" και με print ("Hello from parenthesis")

Δες το παρακατω...

gkapel@thundercats:~$ cat test.py
print "Hello\n"
print ("Hello from Parenthesis")
gkapel@thundercats:~$ python test.py
Hello

Hello from Parenthesis
gkapel@thundercats:~$

Κατι αλλο εχει κανει λαθος αλλα δεν μπωρο να το βρω.

http://s3.battleknight.gr/index.php?loc=hire&ref=NTI4OTY=

[oprime@dexter]$uname -a | awk '{print $1, "on the ROCKS"}' | sed -e 's/on\ the\

Κατ' αρχάς να πω οτι αυτή τη στιγμή τρέχω την Python απο Windows κι όχι από Linux.

Εμένα δεν μου τρέχει χωρίς τις παρενθέσεις αλλά δεν είμαι και πολύ έμπειρος στην Python οπότε πάσσο.

 Αν τρέχεις Python 3.** τότε θέλεις παρενθέσεις , αλλιώς ( στις εκδόσεις 2.* ) δεν χρειάζονται.

 

Ορθογραφικό !!

Στο τέλος της def endElement(

έχεις γράψει insubChapther αντί για insubChapter

 <code>
    def endElement(self,name):
        if name == "Book":
            print "Turning off book flag"
            self.inBook = 0
        elif name == "title":
...
...
        elif name == "sub-chapter":
            print "Turning off sub-chapter flag"
            self.insubChapther = 0
      

if __name__ == "__main__":
...

</code>