📄 xmlwriter.c
字号:
/** */extern "C" {#define XMLWRITER_DEBUG 0#include "XmlWriter.h"#include <stdio.h>XmlWriter XmlWriterCreate(){ XmlWriter w = (XmlWriter)malloc(sizeof(XmlWriter_struct)); if (w == NULL) { return NULL; } w->buf_start = (char *)malloc(BUFFER_BLOCK_SIZE*sizeof(char)); w->buf_ptr = w->buf_start; w->size = BUFFER_BLOCK_SIZE; w->level = 0; w->started = 0; w->valued = 0; return w;}void XmlWriterFree(XmlWriter w){ if (w->buf_start != NULL) { free(w->buf_start); } if (w != NULL) { free(w); }}int _GetLength(XmlWriter w){ return (int)(w->buf_ptr - w->buf_start);}void _Resize(XmlWriter w){ int size = w->size; char *p = w->buf_start; p = (char *)realloc(p, size+BUFFER_BLOCK_SIZE); if (p == NULL) { printf("_Resize(): no enough memory\r\n"); return; } else { w->buf_start = p; w->buf_ptr = p+size; w->size = size+BUFFER_BLOCK_SIZE; return; }}void Write(XmlWriter w, char *buf){ char *p1 = buf; while (*p1 != '\0') { if (w->size == _GetLength(w)) { _Resize(w); } *w->buf_ptr++ = *p1++; } return;}void WriteEscaped(XmlWriter w, const char *buf){ const char *p1 = buf; char temp; if (p1) { while (*p1 != '\0') { if (w->size == _GetLength(w)) { _Resize(w); } else { temp = *p1++; switch (temp) { case '&' : Write(w, "&"); break; case '<' : Write(w, "<"); break; case '>' : Write(w, ">"); break; case '\'': Write(w, "'"); break; case '\"': Write(w, """); break; case '\r': Write(w, "
"); break; default : *w->buf_ptr++ = temp; break; } } } }}void _Indent(XmlWriter w){ int i; int level = w->level; if (level != 0) { for (i=0;i<level;i++) { Write(w, " "); } }}void EndCurrentTag(XmlWriter w){ if (w->started == 1) { Write(w, ">"); w->started = 0; if (w->valued == 0) { Write(w, "\r\n"); } } else { if (w->valued == 0) { Write(w, "\r\n"); } }}void WriteStartDocument(XmlWriter w){ char *XmlStart = "<?xml version=\"1.0\" ?>"; Write(w, XmlStart); return;}void WriteStartElement(XmlWriter w, char *tag, char **ns){// char *_ns = ns; char *_ns; _ns = *ns; EndCurrentTag(w); _Indent(w); Write(w, "<");// if (_ns != NULL) if (strcmp(ns[0], NONAMESPACE[0])) { Write(w, ns[0]); Write(w, ":"); } Write(w, tag); w->started = 1; w->level++; return;}void WriteEndElement(XmlWriter w, char *tag, char **ns){// char *_ns = ns; char *_ns; _ns = *ns; w->level--; if (w->started == 1) { Write(w, " />"); } else { if (w->valued == 0) { Write(w, "\r\n"); _Indent(w); } else { w->valued = 0; } Write(w, "</"); // if (_ns != NULL) if (strcmp(ns[0], NONAMESPACE[0])) { Write(w, ns[0]); Write(w, ":"); } Write(w, tag);// w->started = 1; Write(w, ">"); } w->started = 0;}void WriteAttributeString(XmlWriter w, char **attr, char **ns){// char *_ns = ns;// char *_attr = attr; char *_ns; char *_attr; _ns = *ns; _attr = *attr; Write(w, " ");// if (_ns != NULL) if (strcmp(ns[0], NONAMESPACE[0])) { Write(w, ns[0]); Write(w, ":"); } Write(w, attr[0]); Write(w, "=\""); WriteEscaped(w, attr[1]); Write(w, "\"");}void WriteEndDocument(XmlWriter w){ *w->buf_ptr++ = '\0';}void WriteNamespaces(XmlWriter w, char **ns){// char *_ns = ns; char *_ns; _ns = *ns; Write(w, " xmlns"); // if (_ns != NULL) if (strcmp(ns[0], NONAMESPACE[0])) { Write(w, ":"); Write(w, ns[0]); } Write(w, "=\""); Write(w, ns[1]); Write(w, "\"");}void WriteComment(XmlWriter w, char *str){ EndCurrentTag(w);// Write(w, "\n"); _Indent(w); Write(w, "<!-- "); WriteEscaped(w, str); Write(w, " -->");}void WriteValue(XmlWriter w, const char *value){ w->valued = 1; EndCurrentTag(w); WriteEscaped(w, value);}#if XMLWRITER_DEBUG==1int main(int argc, char *argv[]){ XmlWriter w; char *ns1[] = {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}; char *ns2[] = {"encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"}; char *ns3[] = {"ns1", "urn:TimeService"}; char *attr1[] = {"id", "1"}; char *envelope = "Envelope"; char *body = "Body"; char *getdatetime = "GetDateTime"; char *para1 = "Date"; char *value = "2004-12-16"; w = XmlWriterCreate(); WriteStartDocument(w); WriteStartElement(w, envelope, 0); WriteNamespaces(w, ns1); WriteAttributeString(w, attr1, ns1); WriteStartElement(w, body, ns1); WriteStartElement(w, getdatetime, ns3); WriteNamespaces(w, ns3); WriteValue(w, "this is time!"); WriteEndElement(w, getdatetime, ns3); WriteComment(w, "comment test"); WriteEndElement(w, body, ns1); WriteEndElement(w, envelope, ns1); WriteEndDocument(w); printf("%s", w->buf_start); XmlWriterFree(w); getchar(); return 0;}#endif /* XMLWRITER_DEBUG */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -