mini-xml换行

来源:互联网 发布:bf算法改良 编辑:程序博客网 时间:2024/05/21 17:55

这个问题困扰了我有一些天,由于当时不用换行也行,就那么用了,但是用wireshark抓包,都在一行看起来实在不友好,过了一些天再看用户手册发现了奥秘,感觉手册写了不太清楚。

如果不加换行会是<?xml version="1.0" encoding="utf-8"?><Action><Notify><Variable>KeepAlive</Variable></Notify></Action>

加了换行直观了许多

<?xml version="1.0" encoding="utf-8"?>

<Action>
<Notify>
<Variable>KeepAlive</Variable>
</Notify>

</Action>

手册中有第三章的“保存回调”中有介绍:

mxmlSaveFile() , mxmlSaveString() , 和mxmlSaveAllocString() 函数。这些函数的最后一个参数是一个回调函数被用来自动在一个XML 文档中添加字符。

回调函数是什么样子呢?手册中也有介绍:

const char *whitespace_cb(mxml_node_t *node ,int where)
{
const char *name;
name = node->value.element.name;
if (!strcmp(name, "html") ||!strcmp(name, "head") ||!strcmp(name, "body") ||!strcmp(name, "pre") ||!strcmp(name, "p") ||!strcmp(name, "h1") ||!strcmp(name, "h2") ||!strcmp(name, "h3") ||!strcmp(name, "h4") ||!strcmp(name, "h5") ||!strcmp(name, "h6"))
{
if (where == MXML_WS_BEFORE_OPEN ||where == MXML_WS_AFTER_CLOSE)
return ("\n");
}
else if (!strcmp(name, "dl") ||!strcmp(name, "ol") ||!strcmp(name, "ul"))
{
return ("\n");
}
else if (!strcmp(name, "dd") ||!strcmp(name, "dt") ||!strcmp(name, "li"))
{
if (where == MXML_WS_BEFORE_OPEN)
return ("\t");
else if (where == MXML_WS_AFTER_CLOSE)
return ("\n");
}
return (NULL);
}

一看限定的条件太多了,我的程序没初始化一些参数,所以按照上面的程序执行不好使还是没有换行

我把手册的程序裁剪了下:

const char *whitespace_cb(mxml_node_t *node ,int w)
{
if ( w==MXML_WS_BEFORE_OPEN || w == MXML_WS_AFTER_CLOSE )
return ("\n");
else
return NULL;
}

这就好理解了,手册说:你的回调函数将在每个XML 元素被调用四次,传入参数为一个到这个节点的指针和一个"where" 的值:
MXML_WS_BEFORE_OPEN , MXML_WS_AFTER_OPEN ,MXML_WS_BEFORE_CLOSE , 或者MXML_WS_AFTER_CLOSE

选择第一个和第四个就能形成xml元素换行。

回调函数直接写在mxmlSaveFile() 或 mxmlSaveString() 或mxmlSaveAllocString() 函数的最后一个参数就可以了

eg:

mxmlSaveAllocString(xml, whitespace_cb);

另外mini-xml用户手册在我的资源共享中。