Python and XML Help

ookrin ooklah at gmail.com
Wed Apr 15 00:25:27 EDT 2009


On Apr 14, 8:15 pm, John Machin <sjmac... at lexicon.net> wrote:
> On Apr 15, 12:29 pm, ookrin <ook... at gmail.com> wrote:
>
>
>
> > On Apr 12, 12:51 am, "Diez B. Roggisch" <de... at nospam.web.de> wrote:
>
> > > ookrin schrieb:
>
> > > > I'm in the process of learning python and PyQt4. I had decided to make
> > > > myself a simple app and soon discovered that I needed to crash into
> > > > xml to use some of the data I was going to be getting off of the
> > > > server.
>
> > > > I picked up enough xml to use the sax parser to get the data out of
> > > > the xml. I can get as far as printing it to the screen, but there is
> > > > where I get stuck.... I can't seem to send the data to anywhere else,
> > > > into another variable, to another function. The parser stops after the
> > > > first line it finds.
>
> > > > class offlineLoad():
> > > >     def loadXmlFile(self):
> > > >         print "Loading from File"
> > > >         xf = open('CharacterID.xml','r')
> > > >         xml = xmlHandler()
> > > >         saxparser = make_parser()
> > > >         print "parser created"
> > > >         saxparser.setContentHandler(xml)
> > > >         print "parser runn"
> > > >         try:
> > > >             saxparser.parse(xf)
> > > >         except:
> > > >             print "Error Reading xml"
>
> > > This is a very bad thing to do - there are only very few justified cases
> > > of catch-all for exceptions. This certainly isn't one, as it suppresses
> > > the real cause for what is happening.
>
> > > Which makes it harder for you & for us to diagnose the problem, because
> > > you don't show (and currently can't) the stacktrace to us.
>
> > > Please show us the stacktrace you suppress. Then help might be possible.
>
> > There is actually no stacktrace
> > error. It will just print me the error message that I have when I try
> > to send the variables outside of the if loop. (from the try - except
> > statement.)
>
> That's because (as Diez has already pointed out, and told you to stop
> doing) you are *suppressing* the error message and stack trace that
> will help diagnose what is going wrong in your callback method.
>
> Instead of this:
>         try:
>             saxparser.parse(xf)
>         except:
>             print "Error Reading xml"
> do just this:
>         saxparser.parse(xf)
> or if you really want to print something at the time, do this:
>         try:
>             saxparser.parse(xf)
>         except:
>             print "something meaningful"
>             raise # throw the exception back for normal handling
>
> And just in case you're not taking the advice of Scott D. D. either,
> let me tell you again: use ElementTree, it's easier (no callbacks to
> complicate things) and the ratio of helpful-user-count to problem-
> likelihood is likely to be much higher than with sax.
>
> Cheers,
> John

Ok, I didn't know that was what I was actively doing by using the try-
except. I am still learning. And it's not that I won't take the advice
for using ElementTree, I just currently don't know anything about it.
I just didn't want to say, "I have no idea what you're talking about!"
to Scott cause I figured that would be rude, but I guess so is not
saying anything, sorry. So I'll need to read up on it before I
actually try to do anything with that approach.


Seeing the errors - I changed the two classes to this:

class offlineLoad():
    def loadXmlFile(self):
        print "Loading from File"
        xf = open('CharacterID.xml','r')
        xml = xmlHandler()
        saxparser = make_parser()
        saxparser.setContentHandler(xml)

        saxparser.parse(xf)

class xmlHandler(ContentHandler):
    def __init__(self):
        print "---"
        self.idList = []

    def startElement(self, name, attrs):
        if name == "row":
            charName = attrs.get("name", "")
            charID = attrs.get("characterID", "")
            self.buildlist(charName,charID)

    def buildlist(self,charName,charID):
        temp = charName,charID
        self.idList.append(temp)
        print "----"
        print self.idList

I know calling the self.idList = [] in the init probably isn't
correct, but I couldn't think of any other way currently so it doesn't
get rebuilt every time the definition gets called. This works and at
least I think it puts everything into an array for me. I'm going to
look at the element tree now, but I probably won't figure it out
tonight.

I'm using python 2.6

Thanks so far,
Andrew



More information about the Python-list mailing list