I'm having trouble getting custom error functions working properly. I want to be able to get the error information from parsing errors so I can store it for use later. Specifically with Relax-NG I've attached a sample application which demonstrates how I'm setting up error handlers. I'm using 2.8.0 on OS X 10.8.0. I'm compiling and running with: $ gcc -I /usr/local/Cellar/libxml2/2.8.0/include/libxml2/ -lxml2 test.c $ /a.out 1 b.xml c.xml schema.xml $ /a.out 2 b.xml c.xml schema.xml $ /a.out 3 b.xml c.xml schema.xml $ /a.out 4 b.xml c.xml schema.xml $ /a.out 5 b.xml c.xml schema.xml The numbers on the command line represent different functions I'm setting for the error handler and different types of errors generated by the parser. 1: error function is fprintf and a validation error occurs 2: error function is err_func (a varg function that passes input to fprintf) and a validation error occurs. 3. error function is fprintf and a structural error occurs. 4. error function is err_func and a structural error occurs. I'm seeing strange output when comparing the various tests. A) Test 1 gives, "b.xml:5: element note: Relax-NG validity error : Did not expect element note there" as the output but test 2 gives, "Did not expect element note there". Test 2 just passes the vargs on to fprintf which test 1 is calling directly. Yet as far as I can tell the varg list that err_func receives "%s" as the message and the last part of the error message as the output. So, why is fprintf getting extra error text? B) Test 3 and Test 4 gives the same output and my marker for err_func is never displayed. Test 4 thus isn't every calling err_func but must be using the internal error handler. I've tried multiple ways to set structural error handlers (comments in test.c) but none seem to work. There are 5 different error handler setting functions in test.c I'm not sure which if any of the 5 are correct. xmlRelaxNGSetParserErrors and xmlRelaxNGSetParserStructuredErrors don't appear to do anything. Setting xmlRelaxNGSetValidStructuredErrors causes no error messages to be relayed to the error handling functions. fprintf (as far as I can tell) and err_func (marker is displayed) do not have any message text and display not error output. xmlSetGenericErrorFunc and xmlSetStructuredErrorFunc both end up with strange output when they are set. When 5 is used for the test number (5 runs all 4 tests in a row) fprintf test 3 calls err_func multiple times. It's the full error message just each part is sent to err_func separately. That in itself is strange but what is more strange is error fprintf is the error handler for that test. However, this could be due to some kind of misuse due to the test function calling this on each test. But I don't see how redefining a general error function would cause error handling to use a function other than what was defined... How do I properly define an error handler for both validation and malformed xml errors? How do I get the full error message from the error function? Basically, I'm confused and I'm hoping someone can point me in the right direction as to what I'm missing. John Schember
Attachment:
b.xml
Description: Text Data
Attachment:
c.xml
Description: Text Data
Attachment:
schema.xml
Description: Text Data
Attachment:
test.c
Description: Text Data