Tag: libxml2

libxml2和XPath在ANSI C中遍历子节点和兄弟节点

我在Perl中做了很多XML工作,现在我需要在ANDI C中为项目做一些事情。 这是我用XML片段编写的代码。 我已经获得了学位的成功,但是我遇到了兄弟姐妹的问题,我相信这很容易,但我无法得到它。 有两个函数,一个只是简单地获取节点集(直接从xmlsoft.org复制)。 第二个function是我的。 xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath){ xmlXPathContextPtr context; xmlXPathObjectPtr result; context = xmlXPathNewContext(doc); if (context == NULL) { printf(“Error in xmlXPathNewContext\n”); return NULL; } result = xmlXPathEvalExpression(xpath, context); xmlXPathFreeContext(context); if (result == NULL) { printf(“Error in xmlXPathEvalExpression\n”); return NULL; } if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ xmlXPathFreeObject(result); printf(“No result\n”); return NULL; } return result; […]

LibXML内部和输出编码

我正在尝试用ISO-8859-1中的libxml2编写XML文件。 但是从文档中看来,对于我创建的每个文本节点,我都必须转换为UTF-8,这是libxml的内部编码。 然后,当调用xmlSaveFormatFileEnc()时,libxml将转换为目标编码并将encoding属性添加到文档中。 这个假设是否正确? 现在我的代码大致如下: xmlNode *root_element = NULL, *node4 = NULL; xmlDoc *doc = NULL; doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); root_element = xmlNewDocNode(doc, NULL, BAD_CAST(“root”), NULL); char * input_str = getLatin1Data(); isolat1ToUTF8(utf8_str, &file_size, input_str, &inlen); node4 = xmlNewCDataBlock(doc, BAD_CAST list_content, xmlStrlen(BAD_CAST utf8_str)); xmlAddChild(root_element, node4); xmlSaveFormatFileEnc(“test_file.xml”, doc, “UTF-8”, 1); xmlFreeDoc(doc); xmlNode *root_element = NULL, *node4 = […]

如何使libxml2不显示连接错误?

请考虑以下代码: #include #include 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 也就是说, xmlParseFile会产生不需要的输出。 这里发生的是libxml2尝试将 localhost 转换为IP地址。 得到的是::1和127.0.0.1 。 connect(“[::1]:8000”)导致EINPROGRESS (因为libxml2在描述符上设置了O_NONBLOCK )。 所以libxml2等待它完成 ,这导致POLLOUT | POLLERR | POLLHUP […]

xmlReaderForMemory在第二次调用时崩溃

在谷歌长时间使用之后,我仍无法找到xmlReaderForMemory崩溃的原因/解决方案,仍然使用有效参数。 我已经使用libxml创建了两个解析器函数,当我单独调用它们工作正常。但是当我一个接一个地调用它时,它会在xmlReaderForMemory上崩溃,给出错误s: nayak.exe中0x7c918fea的第一次机会exception:0xC0000005:访问冲突写入位置0x00000010。 nayak.exe中0x7c918fea处的未处理exception:0xC0000005:访问冲突写入位置0x00000010。 现在我给出了两个函数的代码: 第一function: char* CB_omniParser(char *omnistring){ char *parseResult,; const char *fileName = omnistring; char *temp,*texttemp,*result=0; int i,len=0,error; xmlTextReaderPtr reader; len= strlen(omnistring); if(len==0) return 0; reader = xmlReaderForMemory(fileName,len,””,NULL,0); if(reader){ temp = (char *) GlobalAlloc(GPTR, sizeof(char)*len); parseResult = (char *) GlobalAlloc(GPTR,sizeof(char)*len+1); while(error=xmlTextReaderRead(reader)) { if(error==-1){ return 0; // on failure } switch(xmlTextReaderNodeType(reader)) { case XML_READER_TYPE_ELEMENT: […]

使用libxml2读取XML

我正在使用libxml2.so来解析LINUX平台上的C语言中的XML文件。 我的XML格式如下所述。 我可以在文件中包含任意数量的帐户。 在有人在论坛上建议我后,我第一次使用libxml。 我能够解析我只有一个帐户的文件。 如果我有多个帐户,我不明白如何实施。 任何人在C之前都实现了这样的东西,Linux上的libxml。 123 XYZ GA 223 ABC FL

是否有可能克隆xmlTextReader(或多遍读取)?

我目前必须修复现有的应用程序以使用libxml2的DOM接口以外的东西,因为事实certificate它传递的XML文件太大而无法加载到内存中。 我已经重写了从迭代DOM树到大部分时间使用xmlTextReader的数据加载,而没有太多问题。 (我使用xmlNewTextReaderFilename打开本地文件。) 然而,事实certificate,大数据所在的子树必须不按顺序读取,但我必须先收集一些(少量)数据。 (问题正是这个子树包含大量数据,因此只将这个子树加载到内存中也没有多大意义。) 最简单的方法就是“克隆”/“复制”我当前的读者,提前读取然后返回原始实例继续阅读。 (似乎我不是第一个 ……在C#方面甚至实现了一些东西: 带有书签的XML阅读器 。) 但是,似乎没有任何方法可以“复制”xmlTextReader的状态。 如果我不能重新读取文件的一部分 ,我也可以重新读取整个文件,虽然这很浪费,但在这里也可以,但我仍然需要记住我之前的位置? 是否有一种简单的方法可以记住xmlTextReader在当前文档中的位置,这样我以后可以在第二次读取文档/文件时再次找到该位置? 这是一个问题的例子: … here goes up to one GB in stuff … <!– << … even more stuff … <!– I need (part of) the data here to meaningfully interpret the data in [y2] that came before. The best approach would seem […]

libxml xmlXPathEvalExpression命令

我已经开始在C使用libxml ,我正在使用xmlXPathEvalExpression函数来评估XPath。 我的XML文件实际上表示一个表,每个子节点表示该表中的一行,其属性是相应的值,因此顺序很重要。 我无法找到有关该function的信息。 它是否按文档顺序返回节点 例如,以下xml文件: 我可以确定在评估/Root/TABLE0/*并获取节点集后,调用nodeSet->nodeTab[0]会得到第一行, nodeSet->nodeTab[1]会得到第二行,依此类推? 如果没有,有没有办法按文件顺序对其进行排序? 谢谢

使用fastcgi库时libxml到stdout

我们正在尝试使用libxml创建XML提要,生成输出的代码工作正常,生成有效的XML列表,唯一的问题是输出转到错误日志(通过stderr)而不是必需的使用fastcgi库时的网页(通过stdout)。 无论代码是使用浏览器还是使用curl运行,都会出现同样的情况。 Versions/releases: Fedora: release 20 Apache: 2.4.10 fastcgi:? the latest libxml: 2 这个问题没有包含任何代码,因为我认为它不会有所帮助,问题在于fastcgi库’接管’stdout和libxml不承认这一点,而不是代码本身。 如果列表确实被认为是必要的,那么可以添加它,但会增加冗长度而不需要帮助清晰。 简而言之,问题是“我们如何在Linux / Apache上使用带有fastcgi的libxml?” 编辑:如果我提到我们正在用C开发,可能会有所帮助。 编辑:也可能帮助我们知道我们已经尝试了这个标准libxml示例中建议的所有输出方法,用’ – ‘代替’真实’文件名,因此使用stdout。 这没有帮助我们的原因,输出需要转到fastcgi的’cgiOut’替代方案,但在所有情况下都转到stderr。 编辑:据我所知,只有传递libxml文件名,而不是句柄,才能传递输出。 如果输出应该转到stdout,不幸的是,使用文件名’ – ‘,如上所述,输出然后转到错误日志。 如果有可能传递libxml一个文件句柄(当使用fastcgi这将是cgiOut)而不是一个名称然后我怀疑问题将得到解决,但我看不出有任何办法可以做到这一点。

使用xslt在c中创建一个xml文件

我有5个不同的键/值对,我知道我的xml文件应该如何。 如何从中创建xml文件? 1)我总是可以做printf() – 不是更好。 2)我可以使用xslt(stylesheet(.xsl)文件)来做到这一点吗? 并且,我也希望能够执行我刚才提到的反向操作。 给定一个xml文件,我想提取这5个键/值对。 我想,我肯定需要xsl文件来进行此操作。 我只需要一个起点是否可行。 我可以用C编写代码。 示例xml文件:

libxml2属性修改C.

我想在我的xml中更改一个属性(’voltage’): … … 这是我试图这样做的方式: void save_detector_attr(xmlNode *node, xmlDoc *doc){ char *voltage; xmlAttrPtr s_vnewattr; char buf[128]; xmlNode *cur = node->xmlChildrenNode; float sv; int cnt = 0; while(cur != NULL) { if (cur->type == XML_ELEMENT_NODE) { if (!xmlStrcmp(cur->name, “detector”)){ voltage = xmlGetProp(cur, “voltage”); sv = atof(voltage); snprintf(buf, 128, “%f”, sv + 20.1 ); s_vnewattr = xmlNewProp (cur, […]