绪论
Libxml 是一个有免费许可的用于处理 XML 、可以轻松跨越多个平台的 C 语言库。 Libxml 实现了读、创建及操纵 XML 数据功能。
这个指南基于一个简单的 XML 应用。
数据类型
Libxml 定义了许多数据类型,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。 xmlChar 替代 char, 使用 UTF-8 编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到 UTF-8 才能使用 libxml 的函数。在 libxml 编码支持 WEB 页面有更多关于编码的有用信息。
XmlDoc 包含由解析文档建立的树结构, xmlDocPtr 是指向这个结构的指针。
xmlNodePtr and xmlNode 包含单一结点的结构 xmlNodePtr 是指向这个结构的指针,它被用于遍历文档树。
解析文档
解析文档时仅仅需要文件名并只调用一个函数,并有错误检查。
① 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 document/n");
xmlFreeDoc(doc);
return;
}
⑦ if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
①定义解析文档指针。
②定义结点指针 ( 需要它为了在各个结点间移动 ) 。
④检查解析文档是否成功,如果不成功, libxml 将指一个注册的错误并停止。
注释
一个常见错误是不适当的编码。 XML 标准文档除了用 UTF-8 或 UTF-16 外还可用其它编码保存。如果文档是这样, libxml 将自动地为你转换到 UTF-8 。
⑤取得文档根元素
⑥检查确认当前文档中包含内容。
⑦在这个例子中,我们需要确认文档是正确的类型。“ 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 的第一个子结点, cur 指向文档的根,即“ story ”元素。
②这个循环迭代通过“ story ”的子元素查找“ storyinfo ”。这是一个包含有我们将查找的“ keywords ”的元素。它使用了 libxml 字符串比较函数 xmlStrcmp 。如果相符,它调用函数 parseStory 。
void parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
① cur = cur->xmlChildrenNode;
② while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
③ key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("keyword: %s/n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}
Libxml 是一个有免费许可的用于处理 XML 、可以轻松跨越多个平台的 C 语言库。 Libxml 实现了读、创建及操纵 XML 数据功能。
这个指南基于一个简单的 XML 应用。
数据类型
Libxml 定义了许多数据类型,它隐藏了杂乱的来源以致你不必处理它除非你有特定的需要。 xmlChar 替代 char, 使用 UTF-8 编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到 UTF-8 才能使用 libxml 的函数。在 libxml 编码支持 WEB 页面有更多关于编码的有用信息。
XmlDoc 包含由解析文档建立的树结构, xmlDocPtr 是指向这个结构的指针。
xmlNodePtr and xmlNode 包含单一结点的结构 xmlNodePtr 是指向这个结构的指针,它被用于遍历文档树。
解析文档
解析文档时仅仅需要文件名并只调用一个函数,并有错误检查。
① 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 document/n");
xmlFreeDoc(doc);
return;
}
⑦ if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
①定义解析文档指针。
②定义结点指针 ( 需要它为了在各个结点间移动 ) 。
④检查解析文档是否成功,如果不成功, libxml 将指一个注册的错误并停止。
注释
一个常见错误是不适当的编码。 XML 标准文档除了用 UTF-8 或 UTF-16 外还可用其它编码保存。如果文档是这样, libxml 将自动地为你转换到 UTF-8 。
⑤取得文档根元素
⑥检查确认当前文档中包含内容。
⑦在这个例子中,我们需要确认文档是正确的类型。“ 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 的第一个子结点, cur 指向文档的根,即“ story ”元素。
②这个循环迭代通过“ story ”的子元素查找“ storyinfo ”。这是一个包含有我们将查找的“ keywords ”的元素。它使用了 libxml 字符串比较函数 xmlStrcmp 。如果相符,它调用函数 parseStory 。
void parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
① cur = cur->xmlChildrenNode;
② while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
③ key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("keyword: %s/n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}