标签:
目前在研究ossim,其产生告警的依据有一种xml的规则文件。这些文件都是xml树型结构,研究如何使用libxml2 api 生成这种xml 规则时遇到下面的问题:
1、libxml2 api 哪些是构造xml的接口?
1)使用 xmlNewNode 创建一个新的节点,节点指针xmlNodePtr。
2)使用xmlNewProp在节点上增加新的属性
3)需要注意,xml的属性值都是 xmlChar * 的(即char *),可以直接使用BAD_CAST这个宏,在添加一个数字类型的属性值时
需要先转换为字符串。
4)使用xmlAddChild为该节点添加一个孩子节点,继续在孩子节点上添加孙子节点。
2、libxml2 api 如何将构造好的 rule 输出到屏幕查看?
1)构造好一个xml 结构之后,如果需要输出到屏幕查看结果,可以使用xmlDocDumpFormatMemory接口
3、libxml2 api 如何将构造好的 rule 写入xml文件?
1)如果需要将构造好的xml结构写文件,事先要创建一个文件指针:使用接口xmlNewDoc,指针类型:xmlDocPtr
2) 使用xmlNewNode 构造一个根节点,使用xmlDocSetRootElement将这个根节点挂在文件指针上。
3)剩下构造的孩子节点、孙子节点直接挂在上面的根节点上就ok。
4、构造的树形rule在屏幕输出时,是层次分明的,为什么写到文件中就没有层次了?
1) libxml2写文件的接口有很多:
xmlSaveFile:只需要输入一个文件路径和当前的节点指针,其实调用的也是xmlSaveFormatFile,只不过给的默认的format是0.
xmlSaveFormatFile:除了输入上面的两个参数还需要增加format(0/1。。。)
2)当文件format是0 时,写文件就是不分层次的,当format是1 时,写入文件的xml结构是层次分明的树形结构。
5、构造多个树形的规则存xml文件,为什么会覆盖原来的,怎么解决呢?
1)在构造树形的xml结构时,需要选对相关的libxml2接口:
(1)新生成一个xml文件时,使用 xmlDocSetRootElement 添加根节点
(2)在已经有一个或者多个节点的xml文件中继续添加新的、并列关系的节点,即兄弟节点使用xmlAddNextSibling接口
(3)如果需要删除一个树形xml结构中的某一个子节点,首先找到该结构中的根节点,然后使用while循环,遍历每一个节点,
每个节点使用_xmlNode结构体中的next指针连在一起。通过 xmlGetProp找到需要判断的属性值。
使用xmlUnlinkNode以及xmlFreeNode删除这个节点。
使用libxml2实现 ossim xml rule(规则)的构造
标签:
原文地址:http://www.cnblogs.com/liuxftj/p/4273158.html