📄 xml.cpp
字号:
/*
* Openmysee
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include "stdafx.h"
#include "xml.h"
//xml函数库--------------------------------
BOOL CXML::InitXml( )
{
// Initialize COM CoUninitialize
::CoInitialize(NULL);
HRESULT hr = m_plDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
if (FAILED(hr))
{
_com_error er(hr);
AfxMessageBox(er.ErrorMessage());
// EndDialog(1);
return 0;//0为失败
}
HRESULT hr1 = m_plUrlDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
if (FAILED(hr1))
{
_com_error er(hr1);
AfxMessageBox(er.ErrorMessage());
// EndDialog(1);
return 0;//0为失败
}
m_pcurnode = NULL;
m_pnodelist=NULL;
m_pDocRoot=NULL;
m_len = 0;
return 1;
}
void CXML::unInitXml( )
{
while(!m_nodeliststack.empty())
m_nodeliststack.pop();
if(m_plDomDocument != NULL)
{
// m_plDomDocument->Release();
m_plDomDocument = NULL;
}
if(m_plUrlDomDocument != NULL)
{
// m_plUrlDomDocument->Release();
m_plUrlDomDocument = NULL;
}
if(m_pnodelist != NULL)
{
// m_pnodelist->Release();
m_pnodelist = NULL;
}
if(m_pDocRoot != NULL)
{
// m_pDocRoot->Release();
m_pDocRoot = NULL;
}
::CoUninitialize();
}
BOOL CXML::OpenXml(const std::string& strdata )
{
// convert xml file name string to something COM can handle (BSTR)
// specify xml file name
_bstr_t bstrdata(strdata.c_str());
// bstrdata = strdata.AllocSysString();
// call the IXMLDOMDocumentPtr's load function to load the XML document
variant_t vResult;
m_plDomDocument->put_async(0);//同步传输方式
vResult = m_plDomDocument->loadXML(bstrdata);
// vResult = m_plDomDocument->load("d:\\program.xml");
if (((bool)vResult) == TRUE) // success!
{
m_pDocRoot = m_plDomDocument->documentElement;
// bool ret = m_pDocRoot->hasChildNodes();
}
else
{
//AfxMessageBox("Document FAILED to load!");
return FALSE;
}
return TRUE;
}
//返回指定节点的数目
long CXML::GetNodelistNum ( )
{
//IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
return m_pnodelist->Getlength();
}
//设定符合条件的节点列表
long CXML::SetNodelist ( LPCTSTR nodename )
{
_bstr_t _nodename(nodename);
m_pnodelist = m_pDocRoot->selectNodes(_nodename.GetBSTR());
// m_pnodelist = m_pDocRoot->selectNodes(nodename);
if (m_pnodelist==NULL) {
return 0;
}
return m_len = m_pnodelist->Getlength();
}
BOOL CXML::ToNextNode()
{
if(m_pnodelist == NULL)
return FALSE;
m_pcurnode = m_pnodelist->nextNode();
if(m_pcurnode == NULL)
return FALSE;
else
return TRUE;
}
BOOL CXML::ToNode(long l_index)
{
if(l_index >= m_len)
return FALSE;
m_pnodelist->reset();
for (int i=0; i<m_len ; i++) //遍历节点
{
m_pcurnode = m_pnodelist->nextNode();
if (m_pcurnode==NULL)
{
return FALSE;
}
if(i == l_index)
return TRUE;
}
return FALSE;
}
BOOL CXML::ToSubNodeList(LPCTSTR nodename)
{
if(m_pcurnode == NULL)
return FALSE;
_bstr_t _nodename(nodename);
MSXML::IXMLDOMNodeListPtr tpnodelist = m_pcurnode->selectNodes(_nodename.GetBSTR());
if(tpnodelist == NULL || tpnodelist->Getlength() == 0)
return FALSE;
m_nodeliststack.push(m_pnodelist);
m_pnodelist = tpnodelist;
m_curnodestack.push(m_pcurnode);
return TRUE;
}
BOOL CXML::BackParentNodeList()
{
if(m_nodeliststack.empty())
return FALSE;
m_pnodelist = m_nodeliststack.top();
m_nodeliststack.pop();
m_pcurnode = m_curnodestack.top();
m_curnodestack.pop();
return TRUE;
}
BOOL CXML::GetCurNodeAttrValue(mystring& strAttrValue, LPCTSTR attrname)
{
if(m_pcurnode == NULL)
return FALSE;
MSXML::IXMLDOMNodePtr pAttrItem;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs;
m_pcurnode->get_attributes(&pAttrs);
if (pAttrs==NULL)
return FALSE;
_bstr_t _attrname(attrname);
pAttrItem = pAttrs->getNamedItem(_attrname.GetBSTR());//attrname="Name"
if(pAttrItem == NULL)
return FALSE;
strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
return TRUE;
}
//根据名称查找指定的结点:!!!!!!!暂时未用
LPCTSTR CXML::GetNodeValue ( LPCTSTR name )
{
// CString strTemp;
long nCount ;
MSXML::IXMLDOMNodePtr pAttrItem;
MSXML::IXMLDOMElementPtr pRequestTypeAttr;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML::IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(name);
long num = pnodelist->Getlength();
//pnodelist->item(long index);
for (int i=0; i<m_len ; i++) //遍历节点
{
pAttrItem = pnodelist->nextNode();
pAttrItem->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return NULL;
}
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{
//pAttrs->get_item(i,&pAttrItem);
pAttrItem = pAttrs->getNamedItem("Name");
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
// CString strAttrName = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
// CString strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
}
}
return NULL;
}
//根据属性名称和属性值查询对应节点,返回值为节点的索引号,1为第一号
long CXML::SearchByAttrValue ( LPCTSTR attrname, LPCTSTR attrvalue )
{
long l_index=0;
// CString strTemp;
mystring strAttrValue =_T("");
// long nCount ;
MSXML::IXMLDOMNodePtr pAttrItem;
MSXML::IXMLDOMElementPtr pRequestTypeAttr;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
// IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
// long num = pnodelist->Getlength();
//pAttrItem = pnodelist->item(l_index);
m_pnodelist->reset();
for (int i=0; i<m_len ; i++) //遍历节点到指定index节点
{
pAttrItem = m_pnodelist->nextNode();
//取得节点的属性值
pAttrItem->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return -1;
}
pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
mystring strAttrName = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
if (strAttrValue==attrvalue) {
l_index=i+1;
break;
}
}
/*
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{
//pAttrs->get_item(i,&pAttrItem);
pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
}*/
return l_index;
}
//获得根据索引号取得节点属性值
BOOL CXML::GetNodeAttrValue (mystring& strAttrValue, long l_index, LPCTSTR nodename, LPCTSTR attrname )
{
// CString strTemp;
strAttrValue =_T("");
// long nCount ;
MSXML::IXMLDOMNodePtr pAttrItem;
MSXML::IXMLDOMElementPtr pRequestTypeAttr;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML::IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
// long num = pnodelist->Getlength();
//pAttrItem = pnodelist->item(l_index);
//m_pnodelist->reset();
for (int i=0; i<=l_index ; i++) //遍历节点到指定index节点
{
pAttrItem = pnodelist->nextNode();
}
//取得节点的属性值
pAttrItem->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return FALSE;
}
pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
mystring strAttrName = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
/*
pAttrs->get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{
//pAttrs->get_item(i,&pAttrItem);
pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
CString strAttrValue = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
}*/
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -