Re: [xml] Passing user data when using xmlTextReader



Hi Evan,

On Fri, Jul 15, 2011 at 7:39 PM, Evan Klinger <eklinger gmail com> wrote:
Hello,
I would like to use the xmlTextReader interface for parsing my XML
file, but in the parsing routine handler that is called, I need to set
some of my own data depending upon the element's value, but I don't
see any way to pass in my own user data or a void * like you can do in
expat. Is this possible? I don't want to make my struct a global - I'd
like it to be passed into the parsing function directly.

You don't have to bother with things like that when using xmlTextReader.

expat operates on the "don't call us, we'll call you" principle. When
you process an XML document with multiple XML elements, your
start_element handler gets called once for each XML element. Local
context is lost between these callbacks. This is why most callback
interfaces allow passing some sort of user context, to keep persistent
data.

In contrast, with xmlTextReader, *your* code calls libxml2. This means
that any local data is readily available after the call to libxml2
returns control to your code. Processing an XML document with multiple
elements can be as simple as a for loop:

int num_elements = 0;
for (success = xmlTextReaderRead(...); success == 1; success =
xmlTextReaderRead(...))
{
  if (xmlTextReaderNodeType(...) == XML_READER_TYPE_ELEMENT) {
    // do something
    ++num_elements;
  }
}

In this case, all local variables remain in scope for each XML element
processed, like num_elements in the above example.

Hope this helps,
Csaba
-- 
GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
The Tao of math: The numbers you can count are not the real numbers.
Life is complex, with real and imaginary parts.
"Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
"People disagree with me. I just ignore them." -- Linus Torvalds



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]