// xml.cpp : implementation file
//
#include "stdafx.h"
//#include "Rems.h"
#include "xml.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Cxml
Cxml::Cxml()
{
m_pNodeList=NULL;
m_pXmlDoc = NULL;
m_strXmlName = "";
}
Cxml::Cxml(CString strXmlFile)
{
m_pNodeList=NULL;
m_pXmlDoc = NULL;
m_strXmlName = strXmlFile;
}
Cxml::~Cxml()
{
}
CString Cxml::GetErrorMsg()
{
return m_strErrorMsg;
}
bool Cxml::Load(const char strName[])
{
::CoInitialize(NULL); //初始化COM
m_strXmlName = strName;
m_pXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
HRESULT hr =m_pXmlDoc->load(strName);
if(!SUCCEEDED(hr))
{
return true;
}
else
return false;
//(CString)(char *)bstrname;
}
CString Cxml::GetSingleNodeText(const char fileName[], char nodeName[])
{
if(Load(fileName))
{
MSXML2::IXMLDOMNodePtr pNode=NULL;
bstr_t bstrname;
CString ss="//"; // "//..."表示在任意一层查找
ss = ss+nodeName;
pNode = m_pXmlDoc->selectSingleNode((_bstr_t)ss);
CString strReture;
if(pNode == NULL)
{
strReture = "0";
m_strErrorMsg = "The Node Value is Null.";
return strReture;
}
bstrname=pNode->Gettext();
//节点值
VARIANT varVal;
pNode->get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal;
// strValue.Format('%s',(_bstr_t)varVal);
//节点名称
return strValue;
}
CString strTmp;
strTmp = "1";
return strTmp;
}
BOOL Cxml::UpdataSingleNodeText(char nodeName[],char nodeText[])
{
::CoInitialize(NULL); //初始化COM
MSXML2::IXMLDOMNodePtr pNode=NULL;
bstr_t bstrname;
CString ss="//"; // "//..."表示在任意一层查找
ss = ss+nodeName;
pNode = m_pXmlDoc->selectSingleNode((_bstr_t)ss);
pNode->put_text((_bstr_t)nodeText);
m_pXmlDoc->save((_variant_t)m_strXmlName);
return TRUE;
}
CString Cxml::GetSingleNodeText(char nodeName[])
{
::CoInitialize(NULL); //初始化COM
MSXML2::IXMLDOMNodePtr pNode=NULL;
bstr_t bstrname;
CString ss="//"; // "//..."表示在任意一层查找
ss = ss+nodeName;
pNode = m_pXmlDoc->selectSingleNode((_bstr_t)ss);
CString strReture;
if(pNode == NULL)
{
strReture = "0";
m_strErrorMsg = "The Node Value is Null.";
return strReture;
}
bstrname=pNode->Gettext();
//节点值
VARIANT varVal;
pNode->get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal;
return strValue;
}
CString Cxml::GetChildNodeInfo(char nodeName[],char childNodeName[],int nCnt)//.获得二级子节点的值
{
::CoInitialize(NULL); //初始化COM
MSXML2::IXMLDOMNodePtr pNode = NULL;
MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;
MSXML2::IXMLDOMNodeListPtr pChildList = NULL;
bstr_t bstrname;
CString ss="//"; // "//..."表示在任意一层查找
ss = ss+nodeName;
pNodeList = m_pXmlDoc->selectNodes((_bstr_t)ss);//获得名字为nodeName的所有节点
pNodeList->get_item(nCnt-1,&pNode);//获得第nCnt个节点值
pNode->get_childNodes(&pChildList);//获得第nCnt个节点的子节点列表
long lCnt;
pChildList->get_length(&lCnt); //获得所含子节点个数
bstr_t bstrChild,bstrChildInfo;
CString strChild;
CString strChildInfo;
MSXML2::IXMLDOMNodePtr pChildNode = NULL;
for(int i=0;i<lCnt;i++)
{
pChildNode = pChildList->item[i];//得到第i个子节点
bstrChild = pChildNode->GetbaseName();
bstrChildInfo = pChildNode->Gettext();
strChild = (char*)(_bstr_t)bstrChild;
strChildInfo = (char*)(_bstr_t)bstrChildInfo;
if (strcmp(strChild,childNodeName) == 0)
{
return strChildInfo;
}
}
return "";
}
BOOL Cxml::CreateFile(CString strFileName)
{
::CoInitialize(NULL);//初始化CO
try
{
m_strXmlName = strFileName;
HRESULT hr;
hr = m_pXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if (FAILED(hr))
{
m_strErrorMsg = "XML CreateInstance Error!";
return FALSE;
}
MSXML2::IXMLDOMProcessingInstructionPtr pPI=NULL;
pPI=m_pXmlDoc->createProcessingInstruction((_bstr_t)"xml",(_bstr_t)"version=\"1.0\" encoding=\"UTF-8\"");
_variant_t vNullVal;
vNullVal.vt=VT_NULL;
m_pXmlDoc->appendChild(pPI);if (FAILED(hr))
{
m_strErrorMsg = "XML CreateInstance Error!";
return FALSE;
}
}
catch (...)
{
return FALSE;
}
return TRUE;
}
BOOL Cxml::CreateRootNode(CString strNode)
{
HRESULT hr;
hr = m_pXmlDoc->raw_createElement((_bstr_t)strNode, &m_pXmlRoot);//生成xml文件的根节点
if (FAILED(hr))
{
m_strErrorMsg = "XML RootNode Create Error";
return FALSE;
}
m_pXmlDoc->raw_appendChild(m_pXmlRoot, NULL);
return TRUE;
}
BOOL Cxml::InsertNode(CString strChileNode,CString strChileValue)
{
HRESULT hr;
hr = m_pXmlDoc->raw_createElement((_bstr_t)strChileNode, &m_pXmlChildNode);//生成xml文件的节点
if (FAILED(hr))
{
m_strErrorMsg = "XML Node Create Error";
return FALSE;
}
m_pXmlChildNode->Puttext(strChileValue.AllocSysString());
m_pXmlRoot->appendChild(m_pXmlDoc->createTextNode("\n\t")); //换行
m_pXmlRoot->appendChild(m_pXmlChildNode);//增加节点
return TRUE;
}
//第二层为子节点数据
BOOL Cxml::InsertNodeWithChildNode(int nLevel,//第几层为节点数据
int nNode,//子节点数
int nChildNode,//子子节点数
CString strNodeName[],//各层节点名
CString strChildNodeTxt[] //子子节点数据
)
{
HRESULT hr;
hr = m_pXmlDoc->raw_createElement((_bstr_t)strNodeName[0], &m_pXmlChildNode);//生成xml文件的节点
MSXML2::IXMLDOMElementPtr pNode;
MSXML2::IXMLDOMElementPtr pChildNode;
for (int i=0;i<nNode;i++)
{
m_pXmlDoc->raw_createElement((_bstr_t)strNodeName[1], &pNode);//生成xml文件的子节点
for(int j=0; j<nChildNode; j++)
{
m_pXmlDoc->raw_createElement((_bstr_t)strNodeName[nLevel+j], &pChildNode);
pChildNode->Puttext((strChildNodeTxt[nChildNode*i + j]).AllocSysString());
pNode->appendChild(m_pXmlDoc->createTextNode("\n\t\t\t")); //换行
pNode->appendChild(pChildNode);//增加子节点
}
pNode->appendChild(m_pXmlDoc->createTextNode("\n\t\t")); //换行
m_pXmlChildNode->appendChild(m_pXmlDoc->createTextNode("\n\t\t")); //换行
m_pXmlChildNode->appendChild(pNode);//增加节点
}
m_pXmlChildNode->appendChild(m_pXmlDoc->createTextNode("\n\t")); //换行
m_pXmlRoot->appendChild(m_pXmlDoc->createTextNode("\n\t")); //换行
m_pXmlRoot->appendChild(m_pXmlChildNode);//增加节点
return true;
}
BOOL Cxml::InsertChildNode(CString strNode,CString strChildNode,CString strValue)
{
HRESULT hr;
hr = m_pXmlDoc->raw_createElement((_bstr_t)strNode, &m_pXmlChildNode);//生成xml文件的节点
if (FAILED(hr))
{
m_strErrorMsg = "XML Node Create Error";
return FALSE;
}
MSXML2::IXMLDOMElementPtr pNode;
m_pXmlDoc->raw_createElement((_bstr_t)strChildNode, &pNode);//生成m_pXmlChildNode的子节点
pNode->Puttext(strValue.AllocSysString());//写入子节点值
m_pXmlChildNode->appendChild(m_pXmlDoc->createTextNode("\n\t\t")); //换行
m_pXmlChildNode->appendChild(pNode);//增加节点
m_pXmlChildNode->appendChild(m_pXmlDoc->createTextNode("\n\t")); //换行
m_pXmlRoot->appendChild(m_pXmlDoc->createTextNode("\n\t")); //换行
m_pXmlRoot->appendChild(m_pXmlChildNode);//增加节点
return true;
}
BOOL Cxml::InsertChildNodes(CString strNode,CString strChildNode[],CString strValue[],int nChildNodeNum)
{
HRESULT hr;
hr = m_pXmlDoc->raw_createElement((_bstr_t)strNode, &m_pXmlChildNode);//生成xml文件的节点
if (FAILED(hr))
{
m_strErrorMsg = "XML Node Create Error";
return FALSE;
}
MSXML2::IXMLDOMElementPtr pNode;
for (int i=0; i<nChildNodeNum; i++)
{
m_pXmlDoc->raw_createElement((_bstr_t)strChildNode[i], &pNode);//生成m_pXmlChildNode的子节点
pNode->Puttext(strValue[i].AllocSysString());//写入子节点值
m_pXmlChildNode->appendChild(m_pXmlDoc->createTextNode("\n\t\t")); //换行
m_pXmlChildNode->appendChild(pNo
MFC解析XML文档类



在Microsoft Foundation Classes (MFC)库中,XML文档解析是一个重要的功能,允许开发者处理XML数据。XML(eXtensible Markup Language)是一种用于结构化数据的标记语言,广泛应用于网络数据交换、配置文件和数据存储等领域。MFC提供了一种方便的方式来解析和操作XML文档,主要通过`CXMLDOMDocument`类实现。 `CXMLDOMDocument`是MFC对Microsoft XML DOM(Document Object Model)接口的封装,遵循DOM Level 1 和 Level 2 的规范。DOM是一种标准,它将XML文档表示为一个树形结构,每个节点代表XML文档的一部分,如元素、属性、文本等。通过DOM,开发者可以轻松地遍历、修改或创建XML文档。 以下是一些关于使用MFC解析XML文档的关键知识点: 1. **初始化和加载XML文档**: - 创建`CXMLDOMDocument`对象。 - 调用`LoadXML`或`Load`函数加载XML数据。`LoadXML`接受XML字符串作为参数,而`Load`则加载文件路径。 2. **验证XML文档**: - 在加载XML时,可以设置验证标志,如`IXMLDOMDocument::validateOnParse`,来验证XML文档是否符合其指定的DTD(文档类型定义)或XML Schema。 3. **遍历XML文档**: - `CXMLDOMDocument`对象的`GetElementsByTagName`方法可以用来查找具有特定标签名的所有节点。 - `IXMLDOMNode`接口提供了访问子节点、父节点和兄弟节点的方法,如`get_firstChild`、`get_lastChild`、`get_nextSibling`等。 4. **读取XML数据**: - 通过`IXMLDOMNode`的`getText`或`get_nodeValue`方法获取元素或属性的文本值。 - 对于元素节点,可以通过`get_attributes`获取其属性集合,然后使用`getAttribute`或`getAttributeNode`获取特定属性。 5. **修改XML文档**: - 使用`CreateElement`创建新的元素节点,`CreateAttribute`创建属性,`appendChild`添加节点,`removeChild`移除节点。 - 修改节点值或属性值,可以调用`setText`或`setAttribute`。 6. **保存XML文档**: - 调用`Save`方法将DOM树保存到文件,或使用`SaveXML`方法将整个文档保存为XML字符串。 7. **错误处理**: - 在处理XML文档时,可能遇到错误。`CXMLDOMDocument`提供了`GetLastError`方法获取错误信息,`IXMLDOMParseError`接口提供了错误代码、源和描述。 8. **内存管理**: - DOM模型中的节点由COM(Component Object Model)自动管理,当不再需要时会自动释放。但在处理大量节点时,需要注意内存占用。 在`xml.cpp`和`xml.h`这两个文件中,通常会包含MFC解析XML的具体实现,例如创建`CXMLDOMDocument`对象、加载XML文件、遍历并处理XML节点的代码。通过阅读和理解这些代码,你可以更好地掌握如何在MFC应用中有效地解析和操作XML文档。记住,实践中不断试验和调试是学习的关键。
























- 1

- 粉丝: 8
- 资源: 12
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 深度神经网络并行化技术综述与发展前景
- jspm在线教育资源管理系统lw+ppt.zip
- jsp大学生综合素质评分平台lw+ppt.zip
- C#实现三菱FX系列PLC RS422圆口编程协议及测试工具开发
- jsp见福便利店信息管理系统 lw.zip
- jsp交通事故档案管理系统lw+ppt.zip
- jsp摄影器材租赁系统.zip
- jsp智能停车场管理系统lw+ppt.zip
- jsp新生入学信息管理系统lw+ppt.zip
- 基于plc的自动送料小车控制系统.doc
- EKW-模拟版图面试题答案,IC面试真题讲解
- 基于遗传算法工具箱的30节点电力系统无功优化:高效降低成本与提高稳定性
- jsp-招聘信息系统lw+ppt.zip
- ssm大学生社团管理系统lw+ppt.zip
- ssm 考研助手 LW PPT.zip
- ssm-宠物管理系统lw+ppt.zip



- 1
- 2
前往页