㈠ 怎样用vc++读写xml文件
用微软的 DOM,
MSXML4
//引入msxml4.dll
#import "C:/WINNT.0/system32/msxml4.dll"
//创建XMLDOMDocument指针
MSXML2::IXMLDOMDocumentPtr pXMLDoc;
// 初始化COM接口
::CoInitialize(NULL);
// 通过智能指针创建一个解析器的实例
HRESULT hr;
hr =pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
//加载文件
pXMLDoc->load("f://he.xml");
//在树中查找名为City的节点,"//"表示在任意一层查找
MSXML2::IXMLDOMElementPtr childNode ;
childNode = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//AUTHOR"));
//得到节点类型
MSXML2::DOMNodeType nodeType;
childNode->get_nodeType(&nodeType);
//节点名称
BSTR var;
CString name;
childNode->get_nodeName(&var);
name = (char*)(_bstr_t)var;
//节点值
VARIANT varVal;
childNode->get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal;
读属性:
//节点属性,放在链表中
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//NUM"));
childNode->get_attributes(&pAttrs);
long nCount ;
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{
pAttrs->get_item(i,&pAttrItem);
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (char*)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (char*)(_bstr_t)pAttrItem->nodeTypedValue;
}
另外
可以用MSXML DOM
创建一个文档对象的过程。
HRESULT hr;
IXMLDomDocument* pXMLDoc;
IXMLDOMNode* pXDN;
Hr=CoInitialize(NULL); //COM的初始化
hr=CoCreateInstance(CLSID_DOM Document,NULL,CLSCTX_INPPROC_SERVER,
IID_IXMLDOMDocument,(void**) &pXMLDoc);
hr=pXMLDoc->QueryInterface (IID_IXMLDOMNode,(void**)&pXDN);
使用文档中的createElement方法来创建一个节点装载和保存XML文件。通过load或者是loadXML方法可以从一个指定的URL来装载一个XML文档Save方法是用来把文档保存到一个指定的位置,用getElementsByTagName获得制定节点数据
二、
// 创建对象
CoInitialize(NULL); // 初始化COM
// 创建解析器实例
CComPtr<IXMLDOMDocument> spXMLDOM;
BSTR bstrItemText;
// long value;
CString strbuf;
HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
spXMLDOM->put_async(VARIANT_FALSE);
spXMLDOM->put_validateOnParse(VARIANT_FALSE);
spXMLDOM->put_resolveExternals(VARIANT_FALSE);
spXMLDOM->put_preserveWhiteSpace(VARIANT_TRUE);
_bstr_t path = _bstr_t(xmlPath);
// 装载XML文档。
hr=spXMLDOM->load(path);
// 1、读取里面全部文本
spXMLDOM->get_text(&bstrItemText); // new
strbuf = bstrItemText; // new
// 2、读取一个节点
_bstr_t bstrSS("paragraph");
CComPtr<IXMLDOMNodeList> spParagraphs;
spParagraphs=spXMLDOM->getElementsByTagName(bstrSS); //搜索"Paragrah"
//是否正确的得到了指向IDOMNodeList的指针。
hr = spParagraphs->get_length(&value); //得到所包含的NODE节点的个数
if(SUCCEEDED(hr))
...{
spParagraphs->reset();
for(int ii=0; ii<value; ii++)
...{
CComPtr<IXMLDOMNode> spParagraph;
//得到具体的一个NODE节点
// hr = spParagraphs->get_item(ii,&spParagraph);
spParagraph = spParagraphs->nextNode();
if(SUCCEEDED(hr))
...{
spParagraph->get_text(&bstrItemText); //得到该节点相关的文本信息
strbuf += bstrItemText;
strbuf += " ";
}
}
}
㈡ 如何通过读取XML配置文件导入Excel文件到数据中
1.首先,我们正常使用Excel的另存为,看看能否顺利地直接另存为XML文件。
方法:
点击Excel左上角按钮,在弹出的选项中,点击“另存为”
或者直接在Excel中按下快捷键F12
㈢ 用C语言读写xml文件
都是文本格式的,我想与读txt的区别在于两种文件的组织方式不一样而已,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>
我们用C++来读取上述xml,代码如下:
voidCTestToolsDlg::ReadXml(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);
}
voidCTestToolsDlg::ReadCases(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());
}
}
voidCTestToolDlg::ReadCase(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);
}
}
}
为了能够让C++认识MSXML2,我们需要引入相应的dll,代码如下;#import "msxml4.dll"
㈤ c语言怎么加载自己写的配置文件
我是这么做的,比如 ini 里以 #注释,以=表示赋值
#
# Note
#
aaa=bbb
我从ini里一行一行读出来,如果第一个字母是#,就忽略
否则就从 line_of_file 里查找 “=”字符,(去掉行末'\n'换行符)
=之前的就是参数名,=之后的就是参数值(去掉空格,tab)(用strncpy)
㈥ 用c语言读取xml文件中的变量
我这边有c++编写的读取xml中变量的类.(是用一个工具生成的代码,针对特定格式的XmL文件)
呵呵,如果你用c写而不能用cpp文件的话,我就不能帮你了.
㈦ C语言 如何读取xml文件中的数据并存入一个结构体中
利用com、
用xml的dll就可以了,不多说了,具体再不懂再问我把。
我工作也有解析xml文件的 呵呵
㈧ XML文件内容如何读取(C或C++)
可以用微软的IXMLDOMDocument2, 也可以用CMarkup,CMarkup可以在网上搜他怎么用,VS不自带的,要自己在网上下载代码。内感觉CMarkup更容易操作。注意容一点就是假如在一个根element下有多个子element,要注意读子element的顺序,从上往下读,不能从下往上读,它会读不到。
以CMarkup为例:
CMarkup readXML;
if( !readXML.load(xml文件名);
return;
readXML.FindElem("class");
这时候可以用reaXML.GetData()取到132这个值