expat 学习-sample代码修改-支持text输出
来源:互联网 发布:汉王扫描软件下载 编辑:程序博客网 时间:2024/06/05 09:45
expat常用的两个set handler函数:
XML_SetElementHandler(XML_Parser p,
XML_StartElementHandler start,
XML_EndElementHandler end);
XML_SetCharacterDataHandler(XML_Parser p,
XML_CharacterDataHandler hndl);
第一个函数注册了开始元素和结束元素的handle。
第二个函数注册了文本数据的 handle 。
我的XML文档:
<?xml version="1.0" encoding="UTF-8"?><Marker><MarkerName>subtype:caption</MarkerName><Parameters><Parameter><Name>data,en-US</Name><Type>String</Type><Value> CONTINUE TO PLAY </Value></Parameter></Parameters></Marker>
最后程序的输出为:$ ./elements < metadata.xmlMarker MarkerName : subtype:caption Parameters Parameter Name : data,en-US Type : String Value : CONTINUE TO PLAY
sample/elements.c
$ cat sample/elements.c/* This is simple demonstration of how to use expat. This programreads an XML document from standard input and writes a line with thename of each element to standard output indenting child elements byone tab stop more than their parent element. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "xmlparse.h"void startElement(void *userData, const char *name, const char **atts){ int i; int *depthPtr = userData; for (i = 0; i < *depthPtr; i++) putchar('\t'); printf("%s", name); *depthPtr += 1;}void endElement(void *userData, const char *name){ int *depthPtr = userData; *depthPtr -= 1;}/*** 在dataHandle里面,len的长度为1,说明text data为空,但是有一个'\n' ,为了输出漂亮点,做了一个处理。*/void dataHandle(void *userData, char *s, int len){ if (len == 1 && *s == '\n') { putchar('\n'); return; } if (len > 0) { char *text = malloc(len + 1); strncpy(text, s, len); *(text + len)= 0; printf(" : %s", text); }}int main(){ char buf[BUFSIZ]; int done; int depth = 0; XML_Parser parser = XML_ParserCreate(NULL); XML_SetUserData(parser, &depth); XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, (XML_CharacterDataHandler)dataHandle); do { size_t len = fread(buf, 1, sizeof(buf), stdin); done = len < sizeof(buf); if (!XML_Parse(parser, buf, len, done)) { fprintf(stderr, "%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser)); return 1; } } while (!done); XML_ParserFree(parser); return 0;}
在Linux上编译:
在Linux(ubuntu)下,已经有了Makefile,直接make就可以生成需要的libexpat.a,所以编译sample/elements.c就直接用gcc编译就可以了。
编译sample.c:
gcc -Wall -O2 -Ixmltok -Ixmlparse -DXML_NS -DXML_DTD -o elements sample/elements.c xmlparse/libexpat.a
或者参考xmlwf,直接修改Makefile就可以生成sample程序了:
XMLWF=xmlwf/xmlwf$(EXE)
+ELEMENTS=elements$(EXE)
-all: $(XMLWF)
+all: $(XMLWF) $(ELEMENTS)
$(XMLWF): $(OBJS) $(LIB)
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIB)
+$(ELEMENTS):
+ $(CC) $(CFLAGS) -o $@ sample/elements.c $(LIB)
clean:
- rm -f $(OBJS) $(LIBOBJS) $(LIB) $(XMLWF)
+ rm -f $(OBJS) $(LIBOBJS) $(LIB) $(XMLWF) $(ELEMENTS)
- expat 学习-sample代码修改-支持text输出
- 让Expat支持中文XML
- expat解析库学习
- zz - Expat学习笔记
- Expat
- expat
- Expat学习笔记(1)
- 如何让Expat支持中文XML
- UGUI修改Text组件字间距代码
- 移植u-boot学习笔记5----- 修改代码之支持NAND启动
- 移植u-boot学习笔记6-----修改代码支持nor flash
- 移植u-boot学习笔记7-----修改代码之支持nand flash
- 移植u-boot学习笔记8-----修改代码之支持DM9000网卡
- 修改HTK代码,让其支持中文
- 代码SAMPLE 1
- sublime text中<script type="text/ecmascript-6">如何代码高亮并支持语法?
- sublime text编辑器修改python代码的缩进设风格
- Rich Text Editing : Sample Project(富文本编辑)
- Recall Sent Message in Outlook2010
- Android使用Application总结
- CodeProject每日精选: Grid controls(转)
- phpscan是php程序木马扫描器
- TX视频真实地址解析及OC编码实现
- expat 学习-sample代码修改-支持text输出
- TestGuava
- HANA学习季(一) :HANA的基本概念
- LEADTOOLS使用教程:读写、编辑PDF文件和元数据
- 2013.11.11创数字记录
- Xp系统优化 预读文件(8)
- 软考全攻略--下午题必过秘籍
- linux下IPTABLES配置详解 防火墙配置
- C# WinForm开发系列 - DataGrid(转)