加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux下xml的解析

(2007-12-28 15:12:57)
标签:

越来越爱你

linux

杂谈

    
就我个人理解, xml就是html的一个扩展, 相对的html是xml的一个子集.
现在很多的程序用xml写配置文件, 或者存放一些信息, 很方便,
有时候比ini格式用起来还要方便, 这是因为linux下面有库可以解xml格式的文件.
比如Fedora3上自带的libxml2库
下面是我学习xml的一个思路:
1. locate xml|grep lib|grep so 可以看到一些xml的解码库, 当然上网找更容易
2. 选定了libxml2.so, 然后用命令 rpm -qf /usr/lib/libxml2.so,
看它属于哪个rpm包, 结果是它属于libxml2-devel-2.6.14-2包
3. 然后再看看包里的其它内容, 比如帮助什么的, 用命令 rpm -qs libxml2-devel|more
于是就看到了一些html帮助文档, 和example用来试一试.
4. 再在网上找些例子, 就成了.
下面是两个小例子, 用以说明libxml的两种基本用法.
#include <stdio.h>
#include <libxml/xmlreader.h>
#include <libxml/tree.h>
static void processNode(xmlTextReaderPtr reader) {
    const xmlChar *name, *value;
       
    name = xmlTextReaderConstName(reader);
    if (name == NULL)
        name = BAD_CAST "--";
   
    value = xmlTextReaderConstValue(reader);
    if (value != NULL && strcmp(value, "\n") != 0)
        printf("\"%s\"\n", value);
streamFile(const char *filename) {
    xmlTextReaderPtr reader;
    int ret;
    reader = xmlReaderForFile(filename, "GB2312", 0);
    if (reader != NULL) {
        ret = xmlTextReaderRead(reader);
        while(ret == 1) {
            processNode(reader);
            ret = xmlTextReaderRead(reader);
        }
        xmlFreeTextReader(reader);
        if (ret != 0) {
            perror("parse");
        }
    } else {
        perror("open");
    }
}
int main(int argc, char **argv)
{
    if (argc < 2)
        return;
    streamFile(argv[1]);
    xmlCleanupParser();
    xmlMemoryDump();
    return 0;
}
编译方法:
g++ test1.c -o test1 `xml2-config --libs --cflags`
这个例子我是用它example里的reader1.c改的, 简化了一些东西, 让它看起来更简单,
也加入了一些本地化的东东, 如: xmlReaderForFile(filename, "GB2312", 0);
如果不加这一句, xml文件被认为是UTF8编码的, 但是一般windows的编码都是GB2312,
GB18030什么的, 这样写来兼容性好一点儿
注意编译时要加`xml2-config --libs --cflags`, 否则找不着xml库
##############################################################
以上这种方式是按行解析, 更好的方法是按块解析, 我写了一个例子如下:
#include <libxml/parser.h>
#include <libxml/tree.h>
xmlDocPtr doc;
xmlNodePtr root;
void parseNode(xmlNodePtr node)
{
    xmlNodePtr child = NULL;
    printf("    %s:", node->name);
    printf("    %s\n",
       xmlNodeListGetString(doc, node->xmlChildrenNode, 1));
    child = node->xmlChildrenNode;
    while (child != NULL) {
    parseNode(child);
    child = child->next;
    }
}
bool loadXml(char *filename)
{
    doc = xmlParseFile(filename);
    if (doc == NULL)
    return false;
    root = xmlDocGetRootElement(doc);
    if (root == NULL)
    return false;
    parseNode(root);
    return true;
}
int main(int argc, char **argv)
{
    if (argc == 1)
    return -1;
    loadXml(argv[1]);
}
编译方法:
g++ test2.c -o test2 `xml2-config --libs --cflags`

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有