libxml2常用函数集锦之二

libxml库流式解析XML
本文介绍libxml库提供的.net风格API,用于流式读取和解析XML文件。涵盖如何打开文件、读取节点、获取属性及文本等内容。

libxml库提供了一些.net风格的函数,以流的形式来读取并分析xml文件.

 

<libxml/xmlreader.h>

 

xmlTextReader xmlTextReaderPtr //XmlReader的结构体及其指针


xmlTextReaderPtr xmlReaderForFile (const char * filename, const char * encoding, int options) //打开一个xml文件并返回xmlreader对象,准备开始分析.


int xmlTextReaderRead (xmlTextReaderPtr reader) //读取下一个节点(注意,是下一个,不是下一个同层节点)

 

int xmlTextReaderNext (xmlTextReaderPtr reader) //读取下一个同层节点

 

int xmlTextReaderNodeType (xmlTextReaderPtr reader) //判断当前节点的类型

 

xmlChar *xmlTextReaderGetAttribute (xmlTextReaderPtr reader, const xmlChar * name) //获取当前节点的指定属性

 

xmlChar *xmlTextReaderReadString (xmlTextReaderPtr reader) //读取当前节点下的text

 

xmlNodePtr xmlTextReaderExpand (xmlTextReaderPtr reader) //将当前节点展开成一个节点对象(慎用)

 

int xmlTextReaderHasValue (xmlTextReaderPtr reader) //判断当前节点是否有text值

 

int xmlTextReaderHasAttributes (xmlTextReaderPtr reader) //判断当前节点是否包含属性

 

int xmlTextReaderMoveToAttribute (xmlTextReaderPtr reader, const xmlChar * name) //移动指针到当前节点的指定属性名的属性

int xmlTextReaderMoveToAttributeNo (xmlTextReaderPtr reader, int no) //移动指针到当前节点指定属性编号的属性

int xmlTextReaderMoveToElement (xmlTextReaderPtr reader) //将指针移会当前节点

int xmlTextReaderMoveToFirstAttribute (xmlTextReaderPtr reader) //将指针移动到当前节点的第一个属性

int xmlTextReaderMoveToNextAttribute (xmlTextReaderPtr reader) //将指针移动到当前节点的下一个属性

xmlChar *xmlTextReaderName (xmlTextReaderPtr reader) //返回当前节点的名字

### libxml2 解析 XML常用 API 函数 #### 初始化和清理 为了确保程序能够正确初始化并释放资源,可以使用如下函数: - `xmlInitParser()`:初始化全局变量和其他设置[^1]。 - `xmlCleanupParser()`:清理所有分配的内存以及关闭打开的文件。 #### 创建和读取文档对象 创建或加载XML文档时会频繁用到这些API: - `xmlReadFile(const char *URL, const char *encoding, int options)`:此方法接受三个参数——文件路径、字符集名称(可选)、选项标志位组合。成功执行后返回`xmlDocPtr`类型的指针指向新构建好的DOM树根部; 如果失败则返回NULL值。 ```c #include <libxml/parser.h> // ... xmlDocPtr doc; doc = xmlReadFile("example.xml", NULL, 0); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); } ``` #### 获取节点信息 操作DOM树上的各个元素需要用到下面几个重要的接口之一: - `xmlGetRootElement(xmlDocPtr doc)` :取得当前文档最顶层(即根)元素作为起点来进行后续遍历工作[^2]。 - `xmlFirstElementChild(xmlNodePtr node)` : 返回给定父级下的第一个子元素节点[^3]。 - `xmlNextElementSibling(xmlNodePtr sibling)` : 查找同辈序列里的下一个兄弟姐妹成员[^4]。 ```c xmlNodePtr root_element = xmlDocGetRootElement(doc); for (xmlNodePtr current_node = root_element->children ;current_node != NULL;current_node=current_node->next){ if(current_node->type==XML_ELEMENT_NODE){ printf("node type: Element, name: %s\n", current_node->name); } } ``` #### 属性访问 对于属性的操作也有专门的方法支持: - `xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value)` : 向指定位置添加新的特性项。 - `xmlGetProp(xmlNodePtr node, const xmlChar *name)` : 提取出目标实体所携带的具体特征值得到一个字符串副本。 ```c xmlSetProp(root_element,(const xmlChar *)"id",(const xmlChar *)"v1"); printf("%s\n",xmlGetProp(root_element,(const xmlChar*)"id")); ``` #### 销毁文档对象 当不再需要某个已解析完成的对象实例时应该及时销毁它以防止泄露问题发生: - `xmlFreeDoc(xmlDocPtr cur)` : 清除整个文档及其关联的所有内部结构体占用的空间。 ```c xmlFreeDoc(doc); /* free document */ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值