问题描述
考虑以下代码:
#include <stdio.h>
#include <libxml/parser.h>
int main(void) {
xmlDocPtr doc;
xmlChar *s;
doc = xmlParseFile("http://localhost:8000/sitemap.xml");
s = xmlNodeGetContent((struct _xmlNode *)doc);
printf("%s\n", s);
return 0;
}
输出:
$ gcc -g3 -O0 $(xml2-config --cflags --libs) 1.c
$ ./a.out
error : Operation in progress
<result of xmlNodeGetContent>
也就是说,xmlParseFile
会产生不希望的输出.这里发生的是libxml2
尝试翻译 localhost
到IP地址.它得到的是::1
和127.0.0.1
. connect("[::1]:8000")
导致 EINPROGRESS
(因为libxml2
设置了 O_NONBLOCK
).因此libxml2
等待它完成,结果为POLLOUT | POLLERR | POLLHUP
,并且libxml2
报告一个错误.
That is, xmlParseFile
produces undesired output. What happens here is libxml2
tries to translate localhost
to IP address. What it gets is ::1
and 127.0.0.1
. connect("[::1]:8000")
results in EINPROGRESS
(since libxml2
sets O_NONBLOCK
on the descriptor). So libxml2
waits for it to finish, which results in POLLOUT | POLLERR | POLLHUP
, and libxml2
reports an error.
随后的connect("127.0.0.1:8000")
调用成功,因此所有程序均成功完成.
Subsequent connect("127.0.0.1:8000")
call succeeds, so all in all the program finishes successfully.
有没有办法避免这种额外的输出?
Is there a way to avoid this extra output?
推荐答案
如nwellnhof所建议,可以通过设置错误处理程序来规避连接错误.尤其是结构化错误处理程序,无论其含义是什么.
As suggested by nwellnhof, connection errors can be circumvented by setting error handler. Particularly, structured error handler, whatever that means.
其他问题中的答案或多或少我的问题是,另一个问题与解析器错误有关.而且答案没有提供示例代码.所以,
While the answer in the other question more or less answers my question, that other question is about parser errors. And the answer doesn't provide example code. So,
#include <stdio.h>
#include <libxml/parser.h>
void structuredErrorFunc(void *userData, xmlErrorPtr error) {
printf("xmlStructuredErrorFunc\n");
}
void genericErrorFunc(void *ctx, const char * msg, ...) {
printf("xmlGenericErrorFunc\n");
}
int main(void) {
xmlDocPtr doc;
xmlChar *s;
xmlSetGenericErrorFunc(NULL, genericErrorFunc);
xmlSetStructuredErrorFunc(NULL, structuredErrorFunc);
doc = xmlParseFile("http://localhost:8000/sitemap.xml");
s = xmlNodeGetContent((struct _xmlNode *)doc);
printf("%s\n", s);
return 0;
}
这一个输出,
xmlStructuredErrorFunc
<result of xmlNodeGetContent>
这篇关于如何使libxml2不显示连接错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!