C++ 操作XML文件:
xml扩展功能标记语言,是目前主流的数据交换和数据配置的工具,操作XML就成为必备,包括读和写:
一、读取XML:
CStdioFile file;
file.Open ("f:\\a.txt",CFile::modeCreate|CFile::modeWrite);
CString str;
unsigned short buff[128];
memset(buff,0,128);
_bstr_t sname[1024];
_bstr_t qianzi[1024];
_bstr_t bstrname[1024];
_bstr_t CAPP[1024];
_bstr_t strstr;
strstr="->";
_bstr_t en;
_bstr_t strMsg="节点名:";
_bstr_t strmsg="节点值:";
MSXML::IXMLDOMDocumentPtr xdoc;
xdoc.CreateInstance(__uuidof(MSXML::DOMDocument));
xdoc->load("E:\\PIMSBOFCSI0009001.xml");
MSXML::IXMLDOMNodeListPtr nodelist=NULL;
nodelist=xdoc->selectNodes("签字列表/节点");//匹配项
MSXML::IXMLDOMNodePtr subnode;
long nodecount;
nodelist->get_length(&nodecount);
try{
for(long i=0;i<nodecount;i++)
{
subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"节点名称");
if(subnode!=NULL)
{
bstrname[i]=subnode->Gettext();
// m_xmllist.InsertItem(i,"");
// m_xmllist.SetItemText(i,0,"节点名称");
// m_xmllist.SetItemText(i,1,bstrname[i]);
// _bstr_t str1="节点名称";
//en="["+strMsg+str1+"]"+strstr+"["+strmsg+bstrname[i]+"]"+"\r\n";
// file.WriteString (en);
}
}
nodelist->reset ();
for(i=0;i<nodecount;i++)
{
subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"属性名称");
if(subnode!=NULL)
{
sname[i]=subnode->Gettext();
// m_xmllist.SetItemText(i+nodecount,0,"属性名称");
// m_xmllist.SetItemText(i+nodecount,1,sname[i]);
// _bstr_t str2="属性名称";
// en="["+strMsg+str2+"]"+strstr+"["+strmsg+sname[i]+"]"+"\r\n";
// file.WriteString (en);
}
}
nodelist->reset ();
for (i=0;i<nodecount;i++)
{
subnode=nodelist->nextNode()->selectSingleNode((_bstr_t)"签字时间属性名称");
if(subnode!=NULL)
{
qianzi[i]=subnode->Gettext ();
// m_xmllist.SetItemText (i+2*nodecount,0,"签字时间属性名称");
// m_xmllist.SetItemText (i+2*nodecount,1,qianzi[i]);
// _bstr_t str3="签字时间属性名称";
//en="["+strMsg+str3+"]"+strstr+"["+strmsg+qianzi[i]+"]"+"\r\n";
//file.WriteString (en);
}
}
nodelist->reset ();
for (i=0;i<=nodecount;i++)
{
subnode=nodelist->nextNode ()->selectSingleNode((_bstr_t)"CAPP属性集名称");
if(subnode!=NULL)
{
CAPP[i]=subnode->Gettext ();
// m_xmllist.SetItemText (i+3*nodecount,0,"CAPP属性集名称");
// m_xmllist.SetItemText (i+3*nodecount,1,CAPP[i]);
// _bstr_t str4="CAPP属性集名称";
//en="["+strMsg+str4+"]"+strstr+"["+strmsg+CAPP[i]+"]"+"\r\n";
//file.WriteString (en);
}
}
}
//抛出异常
catch(_com_error& err)
{
// return;
}
//读取XML文件内容
MSXML2::IXMLDOMDocumentPtr pXMLDoc = NULL;
pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(pXMLDoc == NULL) return FALSE;
pXMLDoc->async = 0 ;//False;
VARIANT_BOOL vbRet = pXMLDoc->load(_variant_t(strXMLFile));
if (vbRet == VARIANT_FALSE || pXMLDoc->parseError == NULL) return FALSE;
if (pXMLDoc->parseError->errorCode != 0) return FALSE;
if (pXMLDoc->readyState != 4) return FALSE;
MSXML2::IXMLDOMNodePtr xmlNode ;
xmlNode = pXMLDoc->documentElement->selectSingleNode(_T("//xxx"));
if( xmlNode == NULL) return FALSE;
//获取子节点对象
MSXML2::IXMLDOMNodeListPtr xmlNodeList = xmlNode->GetchildNodes();
MSXML2::IXMLDOMNodePtr xmlChildNode;
long i = 0;
for (i == 0; i < xmlNodeList->Getlength(); i++) {
//获取指定索引的子节点对象
xmlChildNode = xmlNodeList->Getitem(i);
CString strNodeName = xmlChildNode->nodeName;
if (strNodeName == _T("wwww")) {
_variant_t value = xmlChildNode->text;
if(value.vt != VT_NULL) {
//
CString strPropPageName = CString(value.bstrVal);
}
}
}
}
catch( _com_error& err) {
return FALSE;
}
catch(...)
{
return FALSE;
}
二、 写XML
HRESULT hr = m_pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
ASSERT(hr == S_OK);
IXMLDOMProcessingInstructionPtr pi = m_pXMLDoc->createProcessingInstruction(_bstr_t(_T("xml")), _bstr_t(_T("version=\"1.0\" encoding=\"UTF-8\"")));
MSXML2::IXMLDOMNodePtr nodePi = pi;
m_pXMLDoc->appendChild(nodePi);
BOOL CXMLDocManager::SaveXML()
{
if(m_pXMLDoc != NULL && !m_strXMLFilePath.IsEmpty())
{
try
{
// 如果存在指定文件,确保该文件具有可写属性
MakeFileReadWrite(m_strXMLFilePath);
_variant_t var = m_strXMLFilePath;
m_pXMLDoc->save(var);
}
catch(_com_error & err)
{
CString strErr = (LPCTSTR)err.Description();
SetErrorInfo(strErr);
return FALSE;
}
catch(CException* err)
{
TCHAR buffer[1024] = {0};
err->GetErrorMessage(buffer, 1024);
CString strErr = buffer;
SetErrorInfo(strErr);
return FALSE;
}
}
return TRUE;
}
BOOL CXMLDocManager::MakeFileReadWrite(const CString& strFileName)
{
CFileStatus status;
BOOL bRetVal = CFile::GetStatus(strFileName, status);
if(bRetVal)
{
status.m_attribute &= ~CFile::readOnly;
CFile::SetStatus(strFileName, status);
}
return bRetVal;
}
BOOL CXMLDocManager::ExpNormalProptyNode(const LONG lUnitID, // 单元ID
const LONG lProptysetID, // 属性集ID
const LONG lProptyID, // 属性ID
const CString& strProptyName, // 属性名
const CString& strProptyValue) // 属性值
{
try
{
MSXML2::IXMLDOMNodePtr nodeProptyset = GetSpecificProptysetNode(lUnitID, lProptysetID);
if(nodeProptyset != NULL)
{
MSXML2::IXMLDOMNodePtr nodeParent = nodeProptyset->selectSingleNode((_bstr_t)_T("普通属性"));
if(nodeParent == NULL)
{
nodeParent = m_pXMLDoc->createElement((_bstr_t)_T("普通属性"));
nodeProptyset->appendChild(nodeParent);
}
ASSERT(nodeParent != NULL);
CString strProptyID;
strProptyID.Format(_T("%ld"), lProptyID);
if(strProptyName != _T(""))
{
MSXML2::IXMLDOMElementPtr pNode = m_pXMLDoc->createElement(_T("字段"));
pNode->setAttribute(_T("FIELDID"), (_bstr_t)strProptyID);
pNode->setAttribute(_T("NAME"), (_bstr_t)strProptyName);
pNode->text = (_bstr_t)strProptyValue;
nodeParent->appendChild(pNode);
#ifdef _DEBUG
SaveXML();
#endif
}
}
}
catch(_com_error & err)
{
CString strErr = (LPCTSTR)err.Description();
SetErrorInfo(strErr);
return FALSE;
}
return TRUE;
}
读取节点属性
<?xml version="1.0" encoding="gb2312" ?>
<UnitType>
<ListCtrlData CardName="工艺总方案封面YB-2" PtyName="aaa||bbb||ccc||ddd||eee||fff"/>
</UnitType>
BOOL EditReleaseOnLineFile::ReadXML(const CString strTypeName)
{
TCHAR buffer[MAX_PATH] = {0};
::GetModuleFileName(NULL, buffer, MAX_PATH);
CString strPath = buffer;
int nIndex = strPath.ReverseFind(_T('\\'));
strPath = strPath.Left(nIndex + 1);
CString strConfigFile = strPath + _T("PIMSHQERON001100.xml");
try{
MSXML2::IXMLDOMDocumentPtr xdoc;
xdoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(xdoc == NULL)
{
AfxMessageBox(_T("创建XML文档对象失败"));
return FALSE;
}
xdoc->load(_variant_t(strConfigFile));
MSXML2::IXMLDOMNodeListPtr nodelist = NULL;
nodelist =xdoc->documentElement->selectNodes(_T("//ListCtrlData"));
MSXML2::IXMLDOMNodePtr subnode;
MSXML2::IXMLDOMNodePtr subnode1;
MSXML2::IXMLDOMNamedNodeMapPtr pNamedNodeMap= NULL;
MSXML2::IXMLDOMNodePtr pAttribNode= NULL;
long nodecount;
nodelist->get_length(&nodecount);
for(long i = 0; i < nodecount; i++)
{
subnode = nodelist->Getitem(i);
/*_variant_t getAttribute (
_bstr_t name );*/
MSXML2::IXMLDOMElementPtr O;
//subnode = nodelist->nextNode()->selectSingleNode((_bstr_t)strTypeName);
if(subnode != NULL)
{
CString strN;
CString strUnitTypeGUID;
strUnitTypeGUID = subnode->attributes->getNamedItem("CardName")->nodeValue;
}
}
}
catch(...)
{
AfxMessageBox(_T("读取配置文件失败"));
return FALSE;
}
return TRUE;
}