C++ 中的 libxml2,为解析器设置编码 - “输入不是正确的 UTF-8”

发布于 2024-11-11 16:39:23 字数 1076 浏览 0 评论 0原文

我想用 C++ 解析来自 Web 服务的简单状态消息,没有编码属性的 xml 片段。

<message xmlns="http://violation.importer.xyz.de/xsd">
    Der Import-Datensatz mit der Bezeichung="blabla" und der Id=68809 wurde erfolgreich importiert.
</message>

它们似乎在 ISO-8859-1 中。我可以将解析器设置为这种编码吗? API 让我感到困惑。

这是我的代码,xml 位于 char* 中(顺便说一句,这是一个迭代器)

xmlNodePtr root_element_ptr;
xmlDocPtr xmldoc_ptr;

xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);
root_element_ptr = xmlDocGetRootElement(xmldoc_ptr);
xmlNodePtr msgnode = root_element_ptr->xmlChildrenNode;
xmlChar *message = xmlNodeListGetString(xmldoc_ptr, msgnode, 1);
response_msg += *message;
response_msg += " / ";
xmlCleanupParser();
xmlFreeDoc(xmldoc_ptr);

,这可以工作,但是元音字符上出现段错误,并且在我的日志中我看到

it.xml:1: 解析器错误:输入不是正确的 UTF-8,指示编码!
字节:0xE4 0x72 0x7A 0x74

那么我必须使用这些什么? http://xmlsoft.org/html/libxml-encoding.html

I want parse in C++ simple status messages from a webservice, xml fragments without encoding attribute.

<message xmlns="http://violation.importer.xyz.de/xsd">
    Der Import-Datensatz mit der Bezeichung="blabla" und der Id=68809 wurde erfolgreich importiert.
</message>

They seem to be in ISO-8859-1 . Can I set the parser to this encoding? The API is confusing to me.

Here's my code, the xml is in char* it (an iterator btw)

xmlNodePtr root_element_ptr;
xmlDocPtr xmldoc_ptr;

xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);
root_element_ptr = xmlDocGetRootElement(xmldoc_ptr);
xmlNodePtr msgnode = root_element_ptr->xmlChildrenNode;
xmlChar *message = xmlNodeListGetString(xmldoc_ptr, msgnode, 1);
response_msg += *message;
response_msg += " / ";
xmlCleanupParser();
xmlFreeDoc(xmldoc_ptr);

this works, but segfaults on Umlaut character and in my log i see

it.xml:1: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x72 0x7A 0x74

so what of these do i have to use? http://xmlsoft.org/html/libxml-encoding.html

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如此安好 2024-11-18 16:39:23

在 SO 上发布问题后,它通常会变得清晰且更容易。这是我改变的并且有效

xmlParserCtxtPtr ctxt_ptr = xmlNewParserCtxt();
xmldoc_ptr = xmlCtxtReadMemory( ctxt_ptr, *it, strlen(*it), "it.xml", "ISO-8859-1", 0);
//xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);

After posting a problem here on SO it often becomes clear and more easy. Here's what I changed and it works

xmlParserCtxtPtr ctxt_ptr = xmlNewParserCtxt();
xmldoc_ptr = xmlCtxtReadMemory( ctxt_ptr, *it, strlen(*it), "it.xml", "ISO-8859-1", 0);
//xmldoc_ptr = xmlReadMemory(*it, strlen(*it), "it.xml", NULL, 0);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文