㈠ 如何使用c语言,使用libxml2创建一个新的格式化XML文件
楼主我给你个思路,你手动写好一个格式化好的 xml 文件;
然后你要格式化哪个 xml 文件,就把原本格式化好的文件覆盖过去就可以了;
㈡ c语言如何调用xml的接口函数
/***************
<?xmlversion="1.0"encoding="utf-8"?>
<Cases>
<case>
<No>001</No>
<CopyFilesrc="C: est.txt"dest="D: est.txt"></CopyFile>
</case>
<case>
<No>002</No>
<DelFile>C: est.txt</DelFile>
</case>
</Cases>
*******************/
//我们用MFC来读取上述xml,代码如下:
voidReadXml(CStringstrXmlPath)
{
MSXML2::IXMLDOMDocumentPtrpDoc;
::CoInitialize(NULL);
HRESULThr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(!SUCCEEDED(hr))
{
MessageBox(_T("创建DOMDocument对象失败。 请检查运行环境"),_T("错误"),MB_ICONERROR);
return;
}
//读取xml
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOLbhr=pDoc->load((_variant_t)strXmlPath);
if(bhr!=VARIANT_TRUE){
MessageBox(_T("无法正确读取xml文件"),_T("错误"),MB_ICONERROR);
return;
}
//根节点取得
MSXML2::IXMLDOMElementPtrroot=pDoc->documentElement;
//取得根节点的名字
_variant_tstrRootName=root->nodeName;
_bstr_twstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtrnodeList=root->GetchildNodes();//cases
//解析cases的子节点
ReadCases(nodeList);
}
voidReadCases(MSXML2::IXMLDOMNodeListPtrnodeList)
{
intilength=nodeList->Getlength();
for(intnodeCount=0;nodeCount<ilength;nodeCount++){
MSXML2::IXMLDOMNodePtrnodePtr=nodeList->nextNode();
_variant_tstrNodeName=nodePtr->GetnodeName();
_variant_tstrNodeValue=nodePtr->GetnodeValue();
//读取case节点下的子节点
ReadCase(nodePtr->GetchildNodes());
}
}
voidReadCase(MSXML2::IXMLDOMNodeListPtrnodeList)
{
CStringstrLogInfo;
strLogInfo.Empty();
CStringstrNo;//case编号
CStringstrSrcFile;//源文件
CStringstrDestFile;//目标文件
for(intnodeCount=0;nodeCount<nodeList->Getlength();nodeCount++)
{
MSXML2::IXMLDOMNodePtrnodePtr=nodeList->nextNode();
_variant_tstrCaseNodeName=nodePtr->GetnodeName();
_variant_tstrCaseNodeValue=nodePtr->Gettext();
BSTRbStrTemp=strCaseNodeName.bstrVal;
CStringstrTemp=CString(bStrTemp);
SysFreeString(bStrTemp);
CStringstrNodeName=strTemp;
//节点的值,如何取得?
if(0==strNodeName.CompareNoCase(_T("NO")))
{
strNo=(BSTR)strCaseNodeValue.pbstrVal;
//取得的值可以打印出来
printf(strNo);
}
//节点有属性值,该怎么处理?
elseif(0==strNodeName.CompareNoCase(_T("CopyFile")))
{
strSrcFile.Empty();
strDestFile.Empty();
//取得节点的属性值
MSXML2::=nodePtr->Getattributes();
for(intj=0;j<pDOMAttrList->Getlength();j++)
{
MSXML2::IXMLDOMNodePtrpDOMAttr=pDOMAttrList->Getitem(j);
//取得源文件路径
if(CompareNoCase((char*)pDOMAttr->GetnodeName(),_T("src")))
{
strSrcFile=pDOMAttr->GetnodeTypedValue();
//取得目标文件路径
}elseif(CompareNoCase((char*)pDOMAttr->GetnodeName(),_T("dest")))
{
strDestFile=pDOMAttr->GetnodeTypedValue();
}
CopyFile(strSrcFile,strDestFile,FALSE);
}
elseif(0==strNodeName.CompareNoCase(_T("DelFile")))
{
strDestFile.Empty();
strDestFile=CString((BSTR)strCaseNodeValue.pbstrVal);
DeleteFile(strDestFile);
}
}
}
//为了能够让MFC认识MSXML2,我们需要引入相应的dll,代码如下;
#import"msxml4.dll"
㈢ c语言如何解析xml并将所有内容存入数组
/*前段时间恰好做过类似的东西,代码可以给你参考下。
*Xml配置见最后
*/
typedefstructSrcFileFmt
{
intColID;
charColCode[64];/*字段英文名称*/
charColName[128];/*字段中文名称*/
charColType[20];/*字段类型(包含长度)*/
charColComment[128];/*字段描述*/
}SrcFileFmt;
intmain(intargc,char**argv)
{
SrcFileFmtSrcFileFmt[128];
intiNum=-1;
if(2>argc)
{
printf("Usage:%sSrcXmlFile ",argv[0]);
return-1;
}
iNum=parseSourceCfg(SrcCfgFile,SrcFileFmt);
if(iNum==-1)
{
return-1;
}
return0;
}
/*调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmtsrcfilefmt[]中
*此函数依赖于libxml2-2.9.2.tar.xz
*/
intparseSourceCfg(char*FileName,SrcFileFmtsrcfilefmt[])
{/*解析源文件xml,FileName为源xml文件名*/
xmlDocPtrdoc;
xmlNodePtrcur,root;
charsFileName[64]={'