ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:23.23KB ,
资源ID:6638738      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-6638738.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c语言解析XML文件Word文档下载推荐.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

c语言解析XML文件Word文档下载推荐.docx

1、完整代码:附录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) empty documentnxmlFreeDoc(doc);if (xmlStrcmp(cur-name, (const xmlChar *) story) document of the

2、wrong type, root node != story定义解析文档指针。定义结点指针(你需要它为了在各个结点间移动)。检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。注释 一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中。取得文档根元素 检查确认当前文档中包含内容。在这个例子中,我们需要确认文档是正确的类型。“Story”是在这个指南中使用文档的根类型。取得元素内容 你找到在文档树中你要查找的元素后可以取得它的内容。在这个

3、例子中我们查找“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的第一个子结点,cur指向文档的根,即“story”元素。这个循环迭代通过“story”的子元素查找“storyinfo”。这是一个包含有我们将查找的“

4、keywords”的元素。它使用了libxml字符串比较函数xmlStrcmp。如果相符,它调用函数parseStory。void parseStory (xmlDocPtr doc, xmlNodePtr cur) xmlChar *key; cur = cur-= NULL) keyword) key = xmlNodeListGetString(doc, cur-xmlChildrenNode, 1);printf(keyword: %sn, key);xmlFree(key); 再次取得第一个子结点。 像上面那个循环一样,我们能过迭代,查找我们感兴趣的叫做“keyword”的元素。 当

5、我们找到元素“keyword”时,我们需要打印它包含在XML中的记录的内容,文本被包含于元素的子结点中,因此我们借助了cur-xmlChildrenNode,为了取得文本,我们使用函数xmlNodeListGetString,它有一个文档指针参数,在这个例子中,我们仅仅打印它。因为xmlNodeListGetString为它返回的字符串分配内存,你必须使用xmlFree释放它。使用XPath取得元素内容除了一步步遍历文档树查找元素外,Libxml2包含支持使用Xpath表达式取得指定结点集。完整的Xpath API文档在这里。Xpath允许通过路径文档搜索匹配指定条件的结点。在下面的例子中,我

6、们搜索文档中所有的“keyword”元素。下面是Xpath完整的讨论。它详细的使用资料,请查阅Xpath规范。这个例子完整的代码参见附录D,XPath例程代码。Using XPath requires setting up an xmlXPathContext and then supplying the XPath expression and the context to the xmlXPathEvalExpression function. The function returns an xmlXPathObjectPtr, which includes the set of node

7、s satisfying the XPath expression. 使用XPath需要安装xmlXPathContext才支持XPath表达式及xmlXPathEvalExpression函数,这个函数返回一个xmlXPathObjectPtr,它包含有XPath表达式的结点集。xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath) xmlXPathContextPtr context;xmlXPathObjectPtr result;context = xmlXPathNewContext(doc);result = xml

8、XPathEvalExpression(xpath, context);if(xmlXPathNodeSetIsEmpty(result-nodesetval) No resultnreturn NULL;xmlXPathFreeContext(context);return result;首先定义变量 初始化变量context 应用XPath表达式 检查结果 由函数返回的xmlPathObjectPtr包含一个结点集和其它需要被迭代及操作的信息。在这个例子中我们的函数返回xmlXPathObjectPtr,我们使用它打印我们文档中keyword结点的内容。这个结点集对象包含在集合(nodeN

9、r)中的元素数目及一个结点(nodeTab)数组。for (i=0; i nodeNr; i+) keyword = xmlNodeListGetString(doc, nodeset-nodeTabi-xmlChildrenNode, printf(, keyword);xmlFree(keyword);变量nodeset-Nr持有结点集中元素的数量。我们使用它遍历数组。打印每个结点包含的内容。Note that we are printing the child node of the node that is returned, because the contents of the k

10、eyword element are a child text node.注意我们打印的是结点的子结点的返回值,因为keyword元素的内容是一个子文本结点。写元素 写元素内容使用上面许多一样的步骤解析文档并遍历树。我们先解析文档然后遍历树查找我们想插入元素的位置。在这个例子中,我们再一次查找“storyinfo”元素并插入一个keyword。然后我们装文件写入磁盘。附录E,添加keyword例程 本例中主要的不同在于parseStory parseStory (xmlDocPtr doc, xmlNodePtr cur, char *keyword) xmlNewTextChild (cur

11、, NULL, XmlNewTextChild函数添加一个当前结点的新的子元素到树中 一旦结点被添加,我们应当写文档到文件中。你是否想给元素指定一个命名空间?你能添加它,在我们的例子中,命名空间是NULL。xmlSaveFormatFile (docname, doc, 1);第一个参数是写入文件的名,你注意到和我们刚刚读入的文件名是一样的。在这个例子中,我们仅仅覆盖原来的文件。第二个参数是一个xmlDoc结构指针,第三个参数设定为1,保证在输出上写入。libxml(二)写属性 写属性类似于给一个新元素写文本。在这个例子中,我们将添加一个reference结点URI属性到我们的文档中。附录F,

12、添加属性例程代码。reference是story元素的一个子结点,所以找到并插入新元素及其属性是简单的。一旦我们在parseDoc进行了错误检查,我们将在正确的位置加放我们的新元素。但进行之前我们需要定义一个此前我们不见过的数据类型。xmlAttrPtr newattr;我们也需要xmlNodePtr:xmlNodePtr newnode;剩下的parseDoc则和前面一样,检查根结点是否为story。如果是的,那我们知道我们将在指定的位置添加我们的元素。 newnode = xmlNewTextChild (cur, NULL, reference, NULL);newattr = xmlN

13、ewProp (newnode, uri, uri);使用xmlNewTextChild函数添国一个新结点到当前结点位置。一旦结点被添加,文件应像前面的例子将我们添加的元素及文本内容写入磁盘。取得属性 取得属性值类似于前面我们取得一个结点的文本内容。在这个例子中,我们将取出我们在前一部分添加的URI的值。附录G,取得属性值例程代码。 这个例子的初始步骤和前面是类似的:解析文档,查找你感兴趣的元素,然后进入一个函数完成指定的请求任务。在这个例子中,我们调用getReference。getReference (xmlDocPtr doc, xmlNodePtr cur) xmlChar *uri;

14、while (cur ! uri = xmlGetProp(cur, uri:xmlFree(uri);关键函数是xmlGetProp,它返回一个包含属性值的xmlChar。在本例中,我们仅仅打印它。如果你使用DTD定义属性的固定值或缺省值,这个函数也将取得它。编码转换 数据编码兼容问题是程序员新建普通的XML或特定XML时最常见的困难。按照这里 稍后的讨论来思考设计你的应用程序将帮助你避免这个困难。实际上,libxml能以UTF-8格式保存和操纵多种数据你的程序使用其它的数据格式,比如常见的ISO-8859-1编码,必须使用libxml函数转换到UTF-8。如果你想你的程序以除UTF-8外的

15、其它编码方式输出也必须做转换。如果能有效地转换数据Libxml将使用转换器。无转换器时,仅仅UTF-8、UTF-16和ISO-8859-1能够被作为外部格式使用。有转换器时,它能将从其它格式与UTF-8互换的任何格式均可使用。当前转换器支持大约150种不同的编码格式之间的相互转换。实际支持的格式数量正在被实现。每一个实现在的转换器尽可能的支持每一种格式。警告 一个常见错误是在内部数据不同的部分使用不同的编码格式。最常见的是情况是一个应用以ISO-8859-1作为内部数据格式,结合libxml部分使用UTF-8格式。结果是一个应用程序要面对不同地内部数据格式。一部分代码执行后,它或其它部分代码将

16、使用曲解的数据。 这个例子构造一个简单的文档,然后添加在命令行提供的内容到根元素并使用适当的编码将结果输出到标准输出设备上。在这个例子中,我们使用ISO-8859-1编码。在命令输入的内容将被从ISO-8859-1转换到UTF-8。附件H,编码转换例程代码。 包含在例子中的转换函数使用libxml的xmlFindCharEncodingHandler函数。xmlCharEncodingHandlerPtr handler;size = (int)strlen(in)+1;out_size = size*2-1;out = malloc(size_t)out_size); handler = x

17、mlFindCharEncodingHandler(encoding);handler-input(out, &out_size, in, &temp);xmlSaveFormatFileEnc(-, doc, encoding, 1);定义一个xmlCharEncodingHandler函数指针。XmlCharEncodingHandler函数需要给出输入和输出字符串的大小,这里计算输入输出字符串。XmlFindCharEncodingHandler使用数据初始编码作为参数搜索libxml已经完成的转换器句柄并将找到的函数指针返回,如果没有找到则返回NULL。The conversion f

18、unction identified by handler requires as its arguments pointers to the input and output strings, along with the length of each. The lengths must be determined separately by the application. 由句柄指定的转换函数请求输入、输出字符中及它们的长度作为参数。这个长度必须由应用程序分别指定。用指定编码而不是UTF-8输出,我们使用xmlSaveFormatFileEnc指不定期编码方式。A. 编译 Libxml包

19、含一个脚本xml2-config,它一般用于编译和链接程序到库时产生标志。 为了取得预处理和编译标志,使用xml2-config cflags,为了取得链接标志,使用xml2-config libs。其它有效的参数请使用xml2-config help查阅。B. 示例文档 storystoryinfoauthorJohn FleckdatewrittenJune 2, 2002keywordexample keyword/storyinfobodyheadlineThis is the headlineparaThis is the body text./body/storyC. Keywor

20、d例程代码 #include string.hstdlib.hlibxml/xmlmemory.hlibxml/parser.hkey = xmlNodeListGetString(doc, cur-static void parseDoc(char *docname) xmlDocPtr doc;xmlNodePtr cur;doc = xmlParseFile(docname);if (doc = NULL ) cur = xmlDocGetRootElement(doc);if (cur = NULL) if (xmlStrcmp(cur-int main(int argc, char *argv) char *docname;if (argc xmlDocPtr getdoc (char *docname) return doc;xmlXPathContextPtr context;context = xmlXPathNewContext(doc);result = xmlXPathEvalExpression(xpath, context);if(xmlXPathNodeSetIsEmpty(result-xmlChar *xpath = (/keywordxmlNodeSetPtr nodeset;int i;xmlChar *keyword;if (arg

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2