gpt4 book ai didi

c - 在 C 中使用 libxml 进行 XML 解析不显示属性名称

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:08 24 4
gpt4 key购买 nike

我正在尝试解析 XHTML 文件并获取属性及其值。使用 libxml。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/HTMLparser.h>
#include <libxml/xmlmemory.h>
#include <libxml/tree.h>
#include <libxml/parser.h>

void walkTree(xmlNode * a_node)
{
xmlNode *cur_node = NULL;
xmlAttr *cur_attr = NULL;
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
// do something with that node information, like… printing the tag’s name and attributes
printf("Got tag : %s\n", cur_node->name);
for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) {
printf(" -> with attribute : %s\n", cur_attr->name);
printf(" -> with Value: %s\n", (cur_attr->children)->name);
}
walkTree(cur_node->children);
}
}
int main(void)
{
// Load XHTML
char *data;
data = "<html><body class=\"123\" damn=\"123\"></html>";

int len = strlen(data) + 1;
htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, 0);
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
htmlParseChunk(parser, data, len, 0);
htmlParseChunk(parser, NULL, len, 1);
walkTree(xmlDocGetRootElement(parser->myDoc));

}

我期待这个输出

 Got tag: html
Got tag: body
-> with attribute: class
-> with value: 123
-> with attribute: damn
-> with value: 123

但不幸的是我得到了这个输出:

 Got tag: html
Got tag: body
-> with attribute: class
-> with value: text
-> with attribute: damn
-> with value: text

我也尝试过其他 html 代码,无论属性值是什么,它总是显示“文本”而不​​是值。

为什么?如何解决?如何获取真实的属性值?

最佳答案

这可以很容易地通过修改一行代码来实现。xmlNodeGetContent() 因为它接受 xmlNode。不像 xmlGetProp() 接受 xmlNodePtr。所以最好使用 xmlNodeGetContent() 在使用 xmlNode 或 xmlAttr 时获取节点的属性.希望有所帮助:)

解决方法如下:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/HTMLparser.h>
#include <libxml/xmlmemory.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
void walkTree(xmlNode * a_node)
{
xmlNode *cur_node = NULL;
xmlAttr *cur_attr = NULL;
xmlChar *attr;
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
// do something with that node information, like… printing the tag’s name and attributes
printf("Got tag : %s\n", cur_node->name);
for (cur_attr = cur_node->properties; cur_attr; cur_attr = cur_attr->next) {

printf(" -> with attribute : %s\n", cur_attr->name);

// This part fixed the code :D
attr = xmlNodeGetContent(cur_attr);

printf(" -> with Value: %s\n", attr);
}
walkTree(cur_node->children);
}
}
int main(void)
{
// Load XHTML
char *data;
data = "<html><body class=\"123\" damn=\"123\"></html>";

int len = strlen(data) + 1;
htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, 0);
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
htmlParseChunk(parser, data, len, 0);
htmlParseChunk(parser, NULL, len, 1);
walkTree(xmlDocGetRootElement(parser->myDoc));

}

关于c - 在 C 中使用 libxml 进行 XML 解析不显示属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215736/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com