minixmlドキュメントからコピー:
コールバック関数は、ノードへのポインタと、、、、、またはの「where」値MXML_WS_BEFORE_OPEN
を使用してMXML_WS_AFTER_OPEN
、要素ノードごとに最大4回呼び出されます。空白を追加しない場合はコールバック関数を返し、それ以外の場合は挿入する文字列(スペース、タブ、キャリッジリターン、改行)を返す必要があります。MXML_WS_BEFORE_CLOSE
MXML_WS_AFTER_CLOSE
NULL
次の空白のコールバックを使用して、XHTML出力に空白を追加し、標準のテキストエディタで読みやすくすることができます。
const char *
whitespace_cb(mxml_node_t *node,
int where)
{
const char *name;
/*
* We can conditionally break to a new line
* before or after any element. These are
* just common HTML elements...
*/
name = mxmlGetElement(node);
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"))
{
/*
* Newlines before open and after
* close...
*/
if (where == MXML_WS_BEFORE_OPEN ||
where == MXML_WS_AFTER_CLOSE)
return ("\n");
}
else if (!strcmp(name, "dl") ||
!strcmp(name, "ol") ||
!strcmp(name, "ul"))
{
/*
* Put a newline before and after list
* elements...
*/
return ("\n");
}
else if (!strcmp(name, "dd") ||
!strcmp(name, "dt") ||
!strcmp(name, "li"))
{
/*
* Put a tab before <li>'s, * <dd>'s,
* and <dt>'s, and a newline after them...
*/
if (where == MXML_WS_BEFORE_OPEN)
return ("\t");
else if (where == MXML_WS_AFTER_CLOSE)
return ("\n");
}
/*
* Return NULL for no added whitespace...
*/
return (NULL);
}
このコールバック関数を使用するには、保存関数のいずれかを呼び出すときに名前を使用するだけです。
FILE *fp;
mxml_node_t *tree;
fp = fopen("filename.xml", "w");
mxmlSaveFile(tree, fp, whitespace_cb);
fclose(fp);