C语言xml解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言xml解析相关的知识,希望对你有一定的参考价值。
C语言解析XML时,使用了一个模子,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<!-- ======================================================================= -->"
"<!-- XML SCHEMA DEFINITION FOR RAML 2.1 -->"
"<!-- Author: Carlos Manzanares -->"
"<!-- Date: 30/11/2005 -->"
"<!-- ======================================================================= -->"
"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\" targetNamespace=\"raml21E.xsd\" xmlns=\"raml21E.xsd\">"
" <xsd:simpleType name=\"planType\">"
" <xsd:restriction base=\"xsd:string\">"
" <xsd:enumeration value=\"actual\"/>"
" </xsd:restriction>"
" </xsd:simpleType>"
。。。
然后通过这个模子,先check一下收到的Xml是否符合规格,
我想设定规格"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"必须的有应该怎么做,
现在收到没有这个头的Xml仍然可以解析。
static const signed char *pgpanaSoapRamlXsdBuffer = "<?xml version=\"1.0\"encoding=\"UTF-8\"?>"
。。。
" <xsd:attribute name=\"dateTime\" type=\"xsd:dateTime\" use=\"optional\"/>"
" <xsd:attribute name=\"action\" type=\"xsd:string\" use=\"optional\"/>"
。。。
这个的作用是判断收到的XML是否符合要求,
例如" <xsd:attribute name=\"dateTime\" type=\"xsd:dateTime\" use=\"optional\"/>"
就是节点中可以有dateTime这个元素也可以没有,我就是想问有没有类似use=\"optional\"的东西来控制 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"是否可以没有。
收到数据后先strstr(buffer,"<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>");
如果返回的是NULL则表示没有这段 退出
buffer是你收到的数据起始地址追问
谢谢回答,我对XML这个不是很了解,我想知道可不可以只修改这个模子,因为如果想你说的查找字符串,那这个模子的意义就不大了
追答不知道你的解析代码是什么样的
同样也无法知道你的模子有什么作用
不过应该是无法做到你说的效果 除非修改解析代码
修改方式和我说的类似
看上面的补充问题,追问能打的字太少
追答貌似不行 你这个应该都是判断某一个项的
自己加判断头的吧
你可以加一个函数,来判断是否有xml的头。
c语言如何解析xml并将所有内容存入数组
/* 前段时间恰好做过类似的东西,代码可以给你参考下。* Xml配置见最后
*/
typedef struct SrcFileFmt
int ColID;
char ColCode[64]; /* 字段英文名称 */
char ColName[128]; /* 字段中文名称*/
char ColType[20]; /* 字段类型(包含长度) */
char ColComment[128]; /* 字段描述 */
SrcFileFmt;
int main(int argc, char **argv)
SrcFileFmt SrcFileFmt[128];
int iNum = -1;
if ( 2 > argc )
printf("Usage: %s SrcXmlFile\\n", argv[0]);
return -1;
iNum = parseSourceCfg(SrcCfgFile, SrcFileFmt);
if (iNum == -1)
return -1;
return 0;
/* 调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmt srcfilefmt[]中
* 此函数依赖于libxml2-2.9.2.tar.xz
*/
int parseSourceCfg(char *FileName, SrcFileFmt srcfilefmt[])
/* 解析源文件xml,FileName 为源xml文件名 */
xmlDocPtr doc;
xmlNodePtr cur, root;
char sFileName[64] = \'\\0\';
int cnt = 0;
if (FileName == NULL)
return -1;
sprintf(sFileName, "%s.xml", FileName);
doc = xmlParseFile(sFileName);
if (doc == NULL)
return -1;
root = xmlDocGetRootElement(doc);
if (root == NULL)
xmlFreeDoc(doc);
return(-1);
if (xmlStrcmp(root->name, (const xmlChar *) "SrcRoot"))
xmlFreeDoc(doc);
return -1;
cur = root->xmlChildrenNode;
while (cur != NULL)
if ((!xmlStrcmp(cur->name, (const xmlChar *)"Column")))
xmlChar *key;
xmlNodePtr cur_sub = cur;
cur_sub = cur_sub->xmlChildrenNode;
while (cur_sub != NULL)
if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColID")))
key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1);
killblank((char*)key);
srcfilefmt[cnt].ColID = atoi((char*)key);
xmlFree(key);
if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColCode")))
key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColCode, (char*)key);
xmlFree(key);
else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColName")))
key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColName, (char*)key);
xmlFree(key);
else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColType")))
key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColType, (char*)key);
xmlFree(key);
else if ((!xmlStrcmp(cur_sub->name, (const xmlChar *)"ColComment")))
key = xmlNodeListGetString(doc, cur_sub->xmlChildrenNode, 1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColComment, (char*)key);
xmlFree(key);
cur_sub = cur_sub->next;
cnt++;
cur = cur->next;
xmlFreeDoc(doc);
return cnt;
<SrcRoot>
<Column>
<ColID>1</ColID>
<ColCode>kmh</ColCode>
<ColName>字段1</ColName>
<ColType>VARCHAR(11)</ColType>
</Column>
<Column>
<ColID>2</ColID>
<ColCode>dfkmh</ColCode>
<ColName>字段2</ColName>
<ColType>VARCHAR(11)</ColType>
</Column>
<Column>
<ColID>3</ColID>
<ColCode>hbh</ColCode>
<ColName>字段3</ColName>
<ColType>INTEGER(10)</ColType>
</Column>
</SrcRoot> 参考技术A 可以试试libxml追问
使用了libxml2 解析做好了 但是xml所有内容保存在哪了
追答你可以看文档,也可以试一下这个网页:
http://www.cnblogs.com/shanzhizi/archive/2012/07/09/2583739.html
或者试试这个:
http://www.cnblogs.com/Anker/p/3542058.html
以上是关于C语言xml解析的主要内容,如果未能解决你的问题,请参考以下文章