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这个不是很了解,我想知道可不可以只修改这个模子,因为如果想你说的查找字符串,那这个模子的意义就不大了

追答

不知道你的解析代码是什么样的
同样也无法知道你的模子有什么作用
不过应该是无法做到你说的效果 除非修改解析代码
修改方式和我说的类似

追问

看上面的补充问题,追问能打的字太少

追答

貌似不行 你这个应该都是判断某一个项的
自己加判断头的吧

参考技术A 有很多xml的解析库,例如:tinyxml。有源码下载的
你可以加一个函数,来判断是否有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解析的主要内容,如果未能解决你的问题,请参考以下文章

c解析xml文件

在linux上用c语言进行xml解析

c语言如何解析xml并将所有内容存入数组

XML解析器

怎么样C语言解析一个XML文件中的信息,跪求高人指点。

怎么样C语言解析一个XML文件中的信息,题目很详细,跪求高人指点。