[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: [xml] odd xpath troubles (xmlNodeSetPtr)
- From: "William M. Brack" <wbrack mmm com hk>
- To: sramsay uga edu
- Cc: xml gnome org
- Subject: Re: [xml] odd xpath troubles (xmlNodeSetPtr)
- Date: Sat, 26 Jun 2004 07:00:47 +0800 (HKT)
sramsay uga edu said:
>
> I'm experiencing some really strange troubles with the xpath
> facilities in libxml2.
"Strange", of course, is a relative term, closely related to the
observer's perceptions.
> I wrote a simple program that uses xpath to grep out some text
> content from a document. The key function goes something like this:
>
> xmlNodeSetPtr nodes;
> xmlNodePtr current;
>
> xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
> nodes = xpathObj->nodesetval;
>
> int size = (nodes) ? nodes->nodeNr : 0;
>
> for (int i = 0; i < size; i++) {
> current = nodes->nodeTab[i];
> printf("%s\n", current->content);
> }
Brevity is admirable, but here there is a bit too much left to the
reader's imagination. I would be particularly interested in the
eventual fate of the object "xpathObj", after the for loop has
completed. Might I assume that it is delivered to
xmlXPathFreeObject for disposal at some point before the routine has
completed?
> This compiles (and works) perfectly. Upon reflection, though, it
> occurred to me that I'd rather have this function return an
> xmlNodeSetPtr to the caller and let the caller print out the nodes.
> This entailed moving some of the above code out of the function and
> into the caller, so now that caller does something like this:
>
> xmlNodeSetPtr nodes;
> xmlNodePtr current;
>
> nodes = get_raw_xml_nodes(filename, xpath);
>
> int size = (nodes) ? nodes->nodeNr : 0;
>
> for (int i = 0; i < size; i++) {
> current = nodes->nodeTab[i];
> printf("%s\n", current->content);
> }
Here there is no longer any XPathObject in view, but the variable
"nodes" is pointing somewhere within it. This presents me with a
choice: either I assume the previous routine left the object intact
(which would be poor programming, creating a possibly severe memory
"leak"), or I assume the previous routine properly freed the object,
and delivered back to the caller a pointer into some memory which
had been freed (which, might I be so bold as to say, would also be
classified as poor programming, but now with possibly disasterous
effects).
> In other words, it does pretty much the same thing, except it grabs
> the xmlNodeSetPtr from another function. This also compiles without
> a hitch.
Compilers are generally in the same class as beasts of burden. The
fact that they don't complain should not be taken as proof that your
actions are exemplary .
> When I run it, I get the same output as I did before, but with the
> first four characters or so of each content node as junk characters
> (the rest is fine). Can anyone think of any possible reason why
> this might be so? Why would the xmlNodeSet be any different when
> picked up as a return value from another function?
>
Could it be possible that the memory containing the node data has
been freed? That often produces this symptom (and how could I
possibly be so familar with such facts......).
> I tried searching through the archives, but the search function
> seems to be busted at the moment. My documents are in UTF-8.
Use the search engine at http://xmlsoft.org, where you can also find
full descriptions of the functions as well as example programs.
> I'm thinking the answer might be "go learn C," but I don't think so.
> I've been pouring over it for hours.
>
> Steve
>
> --
> Stephen Ramsay
> Assistant Professor
> Department of English
> University of Georgia
> email: sramsay uga edu
> web: http://cantor.english.uga.edu/
> PGP Public Key ID: 0xA38D7B11
Again, it's difficult to make a good diagnosis with the limited
information you supplied. If my above guesses are wrong, try
posting more details and other list members may have better ideas.
Regards,
Bill
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]