Linux环境下C使用的XML解析库new

上传人:xins****2008 文档编号:111150357 上传时间:2019-11-01 格式:DOC 页数:16 大小:83KB
返回 下载 相关 举报
Linux环境下C使用的XML解析库new_第1页
第1页 / 共16页
Linux环境下C使用的XML解析库new_第2页
第2页 / 共16页
Linux环境下C使用的XML解析库new_第3页
第3页 / 共16页
Linux环境下C使用的XML解析库new_第4页
第4页 / 共16页
Linux环境下C使用的XML解析库new_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Linux环境下C使用的XML解析库new》由会员分享,可在线阅读,更多相关《Linux环境下C使用的XML解析库new(16页珍藏版)》请在金锄头文库上搜索。

1、Linux环境下C使用的XML解析库:libxml22010-12-09 18:16:58|分类: Linux |标签: |字号大中小订阅 Libxml是一个实现读、创建及操纵XML数据功能的C语言库。这个指南提供例子代码并给 出它基本功能的解释。在这个项目的主页上有Libxml及更多关于它可用的资料。包含有完整的API文档。这个指南并不能替代这些完整的文档,但是阐明功 能需要使用库来完成基本操作。这个指南基于一个简单的XML应用,它使用我写的一篇文章生成,它包含有元数据和文章的主体。本指南中的例子代码示范如何做到:? 解析文档? 取得指定元素的文本? 添加一个元素及它的内容? 添加一个属性?

2、 取得一个属性的值例子的完整代码包含在附录中数据类型Libxml定义了许多数据类型,我们将反复碰到它们,它隐藏了杂乱的来源以致你不必处理它 除非你有特定的需要。xmlChar 替代char,使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使用libxml的函数。在libxml编码 支持WEB页面有更多关于编码的有用信息。XmlDoc 包含由解析文档建立的树结构,xmlDocPtr是指向这个结构的指针。xmlNodePtr and xmlNode 包含单一结点的结构xmlNodePtr是指向这个结构的指针,它被用于遍历文档树。解析文档解析文档时仅仅需要文件

3、名并只调用一个函数,并有错误检查。完整代码:附录C, Keyword例程代码xmlDocPtr doc;xmlNodePtr cur;doc = xmlParseFile(docname);if (doc = NULL ) fprintf(stderr,Document not parsed successfully. n);return;cur = xmlDocGetRootElement(doc);if (cur = NULL) fprintf(stderr,empty documentn);xmlFreeDoc(doc);return;if (xmlStrcmp(cur-name, (c

4、onst xmlChar *) story) fprintf(stderr,document of the wrong type, root node != story);xmlFreeDoc(doc);return;定义解析文档指针。定义结点指针(你需要它为了在各个结点间移动)。检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。注释一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中。取得文档根元素检查确认当前文档中包含内容。在这个

5、例子中,我们需要确认文档是正确的类型。“Story”是在这个指南中使用文档的根类型。取得元素内容你找到在文档树中你要查找的元素后可以取得它的内容。在这个例子中我们查找“story”元素。进程将在冗长的树中查找我们感兴趣的元素。我们假定期你已经有了一个名为doc的xmlDocPtr和一个名为cur的xmlNodPtr。cur = cur-xmlChildrenNode;while (cur != NULL) if (!xmlStrcmp(cur-name, (const xmlChar *)storyinfo)parseStory (doc, cur);cur = cur-next;取得cur的

6、第一个子结点,cur指向文档的根,即“story”元素。这个循环迭代通过“story”的子元素查找“storyinfo”。这是一个包含有我们将查找的“keywords”的元素。它使用了libxml字符串比较函数xmlStrcmp。如果相符,它调用函数parseStory。voidparseStory (xmlDocPtr doc, xmlNodePtr cur) xmlChar *key; cur = cur-xmlChildrenNode;while (cur != NULL) if (!xmlStrcmp(cur-name, (const xmlChar *)keyword) key =

7、xmlNodeListGetString(doc, cur-xmlChildrenNode, 1);printf(keyword: %sn, key);xmlFree(key);cur = cur-next;return; 再次取得第一个子结点。 像上面那个循环一样,我们能过迭代,查找我们感兴趣的叫做“keyword”的元素。 当我们找到元素“keyword”时,我们需要打印它包含在XML中的记录的内容,文本被包含于元素的子结点中,因此我们借助了 cur-xmlChildrenNode,为了取得文本,我们使用函数xmlNodeListGetString,它有一个文档指针参数,在这个 例子中,我

8、们仅仅打印它。注释因为xmlNodeListGetString为它返回的字符串分配内存,你必须使用xmlFree释放它。使用XPath取得元素内容除了一步步遍历文档树查找元素外,Libxml2包含支持使用Xpath表达式取得指定结点集。完整的Xpath API文档在这里。Xpath允许通过路径文档搜索匹配指定条件的结点。在下面的例子中,我们搜索文档中所有的“keyword”元素。注释下面是Xpath完整的讨论。它详细的使用资料,请查阅Xpath规范。这个例子完整的代码参见附录D,XPath例程代码。Using XPath requires setting up an xmlXPathConte

9、xt and then supplying the XPath expression and the context to the xmlXPathEvalExpressionfunction.The function returns an xmlXPathObjectPtr, which includes the set of nodes satisfying the XPath expression.使用XPath需要安装xmlXPathContext才支持XPath表达式及xmlXPathEvalExpression函数,这个函数返回一个xmlXPathObjectPtr,它包含有XPa

10、th表达式的结点集。xmlXPathObjectPtrgetnodeset (xmlDocPtr doc, xmlChar *xpath)xmlXPathContextPtr context;xmlXPathObjectPtr result;context = xmlXPathNewContext(doc);result = xmlXPathEval;if(xmlXPathNodeSetIsEmpty(result-nodesetval)printf(No resultn);return NULL;xmlXPathFreeContext(context);return result;首先定义变

11、量初始化变量context应用XPath表达式检查结果由函数返回的xmlPathObjectPtr包含一个结点集和其它需要被迭代及操作的信 息。在这个例子中我们的函数返回xmlXPathObjectPtr,我们使用它打印我们文档中keyword结点的内容。这个结点集对象包含在集合 (nodeNr)中的元素数目及一个结点(nodeTab)数组。for (i=0; i nodeNr; i+) keyword = xmlNodeListGetString(doc,nodeset-nodeTabi-xmlChildrenNode, printf(keyword: %sn, keyword);xmlFr

12、ee(keyword);变量nodeset-Nr持有结点集中元素的数量。我们使用它遍历数组。打印每个结点包含的内容。注释Note that we are printing the child node of the node that is returned, because the contents of the keyword element are a child text node.注意我们打印的是结点的子结点的返回值,因为keyword元素的内容是一个子文本结点。写元素写元素内容使用上面许多一样的步骤解析文档并遍历树。我们先解析文档然后遍历树查找我们想插入元素的位置。在这个例子中,我

13、们再一次查找“storyinfo”元素并插入一个keyword。然后我们装文件写入磁盘。完整代码:附录E,添加keyword例程本例中主要的不同在于parseStoryvoidparseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) xmlNewTextChild (cur, NULL, keyword, keyword);return;XmlNewTextChild函数添加一个当前结点的新的子元素到树中一旦结点被添加,我们应当写文档到文件中。你是否想给元素指定一个命名空间?你能添加它,在我们的例子中,命名空间是NULL。xmlSave

14、FormatFile (docname, doc, 1);第一个参数是写入文件的名,你注意到和我们刚刚读入的文件名是一样的。在这个例子中,我们仅仅覆盖原来的文件。第二个参数是一个xmlDoc结构指针,第三个参数设定为1,保证在输出上写入。libxml(二)写属性写属性类似于给一个新元素写文本。在这个例子中,我们将添加一个reference结点 URI属性到我们的文档中。完整代码:附录F,添加属性例程代码。reference是story元素的一个子结点,所以找到并插入新元素及其属性是简单 的。一旦我们在parseDoc进行了错误检查,我们将在正确的位置加放我们的新元素。但进行之前我们需要定义一个

15、此前我们不见过的数据类型。xmlAttrPtr newattr;我们也需要xmlNodePtr:xmlNodePtr newnode;剩下的parseDoc则和前面一样,检查根结点是否为story。如果是的,那我们知道我们将在指定的位置添加我们的元素。 newnode = xmlNewTextChild (cur, NULL, reference, NULL);newattr = xmlNewProp (newnode, uri, uri);使用xmlNewTextChild函数添国一个新结点到当前结点位置。一旦结点被添加,文件应像前面的例子将我们添加的元素及文本内容写入磁盘。取得属性取得属性值类似于前面我们取得一个结点的文本内容。在这个例子中,我们将取出我们在前一部分添加的URI的值。完整代码:附录G,取得属性值例程代码。这个例子的初始步骤和前面是类

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号