xml开发手册c语言函数 c语言 xml

怎么用C语言写一个简单的XML文件

用VC吧,下面有一个例子,你参照下:

成都地区优秀IDC服务器托管提供商(创新互联建站).为客户提供专业的四川移动机房托管,四川各地服务器托管,四川移动机房托管、多线服务器托管.托管咨询专线:18982081108

void CreateXml()

{

CoInitialize(NULL);

// 创建文档

MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL;

//创建DOMDocument对象

HRESULT hr = pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));

if (!SUCCEEDED(hr))

{

return;

}

// Create the Processing Instruction

MSXML2::IXMLDOMProcessingInstructionPtr pXMLProc = NULL;

pXMLProc = pXMLDoc-createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");

_variant_t vNullVal;

vNullVal.vt = VT_NULL;

pXMLDoc-insertBefore(pXMLProc, vNullVal);

// 创建根结点

_variant_t varNodeType((short)MSXML2::NODE_ELEMENT);

MSXML2::IXMLDOMNodePtr pXMLNodeRoot= NULL; 

pXMLNodeRoot = pXMLDoc-createNode(varNodeType, _T("Cases"), _T(""));

// 添加根结点

pXMLDoc-appendChild(pXMLNodeRoot);

// 创建并添加下级结点

MSXML2::IXMLDOMNodePtr pXMLNodeNode= NULL; 

pXMLNodeNode = pXMLNodeRoot-appendChild(pXMLDoc-createElement(_T("Case")));

// 创建下级元素结点

MSXML2::IXMLDOMElementPtr pXMLEle = NULL;

pXMLEle = pXMLDoc-createElement(_T("CopyFile"));

// 创建并设置下级结点属性

MSXML2::IXMLDOMAttributePtr pXMLAttr = NULL;

pXMLAttr = pXMLDoc-createAttribute(_T("src"));

pXMLAttr-nodeTypedValue = "C:\\test.txt";

pXMLEle-attributes-setNamedItem(pXMLAttr);

pXMLAttr = pXMLDoc-createAttribute(_T("dest"));

pXMLAttr-nodeTypedValue = "D:\\Test.txt";

pXMLEle-attributes-setNamedItem(pXMLAttr);

// 添加元素结点

pXMLNodeNode-appendChild( pXMLEle);

MSXML2::IXMLDOMElementPtr pXMLEle1 = NULL;

pXMLEle1 = pXMLDoc-createElement(_T("DelFile"));

pXMLEle1-appendChild(pXMLDoc-createTextNode("C:\\test.txt"));

// 添加元素结点

pXMLNodeNode-appendChild( pXMLEle1);

// 保存文档

pXMLDoc-save(_T("d:\\Test.xml"));

}

效果如下:

?xml version="1.0" encoding="UTF-8" ? 

Cases

Case

CopyFile src="C:\test.txt" dest="D:\Test.txt" / 

DelFileC:\test.txt/DelFile 

/Case

/Cases

为了能够让MFC认识MSXML2,我们需要引入相应的dll,代码如下;

#import "msxml4.dll"

C语言xml解析

把所有的数据当做一个字符串

收到数据后先strstr(buffer,"?xml version=\"1.0\" encoding=\"UTF-8\"?");

如果返回的是NULL则表示没有这段 退出

buffer是你收到的数据起始地址

c语言如何调用xml的接口函数

/***************

?xml version="1.0" encoding="utf-8"?

Cases

case

No001/No

CopyFile src="C:\test.txt" dest="D:\test.txt"/CopyFile

/case

case

No002/No

DelFileC:\test.txt/DelFile

/case

/Cases

*******************/

// 我们用MFC来读取上述xml,代码如下:

void ReadXml(CString strXmlPath)

{

MSXML2::IXMLDOMDocumentPtr pDoc;

::CoInitialize(NULL);

HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); 

if (!SUCCEEDED(hr)) 

{  

MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR); 

return;

}

// 读取xml

pDoc-put_async(VARIANT_FALSE);

VARIANT_BOOL bhr = pDoc-load((_variant_t)strXmlPath);

if (bhr != VARIANT_TRUE) {

MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);

return;

}

// 根节点取得

MSXML2::IXMLDOMElementPtr root = pDoc-documentElement;

// 取得根节点的名字

_variant_t strRootName = root-nodeName;

_bstr_t wstrRootName(strRootName.bstrVal);

MSXML2::IXMLDOMNodeListPtr nodeList = root-GetchildNodes();//cases

// 解析cases的子节点

ReadCases(nodeList);

}

void ReadCases(MSXML2::IXMLDOMNodeListPtr nodeList)

{

int ilength = nodeList-Getlength();

for (int nodeCount = 0; nodeCount  ilength; nodeCount++) {

MSXML2::IXMLDOMNodePtr nodePtr = nodeList-nextNode();

_variant_t strNodeName = nodePtr-GetnodeName();

_variant_t strNodeValue = nodePtr-GetnodeValue();

// 读取case节点下的子节点

ReadCase(nodePtr-GetchildNodes());

}

}

void ReadCase(MSXML2::IXMLDOMNodeListPtr nodeList)

{

CString strLogInfo;

strLogInfo.Empty();

CString strNo;              // case编号

CString strSrcFile;         // 源文件

CString strDestFile;        // 目标文件

for (int nodeCount = 0; nodeCount  nodeList-Getlength(); nodeCount++)

{

MSXML2::IXMLDOMNodePtr nodePtr = nodeList-nextNode();

_variant_t strCaseNodeName = nodePtr-GetnodeName();

_variant_t strCaseNodeValue = nodePtr-Gettext();

BSTR bStrTemp = strCaseNodeName.bstrVal;

CString strTemp = CString(bStrTemp);

SysFreeString(bStrTemp);

CString strNodeName = strTemp;

//  节点的值,如何取得?

if (0 == strNodeName.CompareNoCase(_T("NO")))

{

strNo = (BSTR)strCaseNodeValue.pbstrVal;

// 取得的值可以打印出来

printf(strNo);

}

// 节点有属性值,该怎么处理?

else if (0 == strNodeName.CompareNoCase(_T("CopyFile")))

{

strSrcFile.Empty();

strDestFile.Empty();

// 取得节点的属性值

MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr-Getattributes();

for (int j = 0; j  pDOMAttrList-Getlength(); j++)

{

MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList-Getitem(j); 

// 取得源文件路径

if (CompareNoCase((char*)pDOMAttr-GetnodeName(), _T("src")))

{

strSrcFile = pDOMAttr-GetnodeTypedValue();

// 取得目标文件路径

} else if (CompareNoCase((char*)pDOMAttr-GetnodeName(), _T("dest")))

{

strDestFile =pDOMAttr-GetnodeTypedValue();

}

CopyFile(strSrcFile, strDestFile, FALSE);

}

else if (0 == strNodeName.CompareNoCase(_T("DelFile")))

{

strDestFile.Empty();

strDestFile = CString((BSTR)strCaseNodeValue.pbstrVal);

DeleteFile(strDestFile);

}

}

// 为了能够让MFC认识MSXML2,我们需要引入相应的dll,代码如下;

#import "msxml4.dll"

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

ColID1/ColID

ColCodekmh/ColCode

ColName字段1/ColName

ColTypeVARCHAR(11)/ColType

/Column

Column

ColID2/ColID

ColCodedfkmh/ColCode

ColName字段2/ColName

ColTypeVARCHAR(11)/ColType

/Column

Column

ColID3/ColID

ColCodehbh/ColCode

ColName字段3/ColName

ColTypeINTEGER(10)/ColType

/Column

/SrcRoot

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

这个要求不需要作XML的解析,用字符串搜索功能就足够了,把网页内容读出之中按字符串搜索就可以找到lat和lng。

比如让指针 char * page 指向读取得到的网页内容,就可以这样得到经度lat和纬度lng:

#include string.h

#include stdio.h

double lat, lng;

char * str_lat, *str_lng;

str_lat = strstr(page, "lat"); /*搜索字符串lat的位置*/

sscanf(str_lat+5, "%lf", lat); /*从搜索到的位置之后读取一个浮点数作为纬度lat*/

str_lng = strstr(page, "lng");

sscanf(str_lng+5, "%lf", lng); /*类似地,读出经度lng*/

用C语言读取xml文件,怎么实现?

xml文件和txt文件相同,使用普通的文本操作函数即可读取。

1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。

2、例程:

#includestdio.h

int a;

char b,c[100];

int main(){

FILE * fp1 = fopen("input.xml", "r");//打开xml格式输入文件

FILE * fp2 = fopen("output.txt", "w");//打开输出文件

if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出

puts("不能打开文件!");

rturn 0;

}

fscanf(fp1,"%d",a);//从输入文件读取一个整数

b=fgetc(fp1);//从输入文件读取一个字符

fgets(c,100,fp1);//从输入文件读取一行字符串

printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数

fputs(c,fp2);//向输出文件写入一行字符串

fputc(b,fp2);//向输出文件写入一个字符

fprintf(fp2,"%d",a);//向输出文件写入一个整数

fclose(fp1);//关闭输入文件

fclose(fp2);//关闭输出文件,相当于保存

return 0;

}


网页名称:xml开发手册c语言函数 c语言 xml
网页URL:http://cdiso.cn/article/hghghd.html

其他资讯