MSXML 解析XML文件
2015-11-18 21:24
375 查看
MSXML 解析XML文件
<msglist>
<data>
<Name>changjiang</Name>
<ID>1</ID>
</data>
<data>
<Name>wang</Name>
<ID>2</ID>
</data>
</msglist>
1.先要#Import<MSXML6.dll>
2.要添加命名空间
3.创建组件两种方式CreateInstance和CoCreateInstance,有的时候直接添加IID时候不能编译通过添加到 __uuidof(MSXML2::DOMDocument60)可以编过
4.设置相关属性 pXmlDoc->put_async(VARIANT_FALSE);
pXmlDoc->put_validateOnParse(VARIANT_FALSE);
pXmlDoc->put_resolveExternals(VARIANT_FALSE);
5.打开xml文件,在网上找的大部分是直接打开xml文件,我的编译不通过可能是用的msxml版本不同吧,
VariantInit( &vXMLSrc );
vXMLSrc.vt = VT_BSTR;
vXMLSrc.bstrVal = SysAllocString(L"test.xml");
设置打开相关文件
6.这样打开的指针式文件的指针我理解的其实每一个《》中的就是一个NODE,这是用文件指针pXmlDoc遍历data node是不可见的
所以要先指定<msglist> node 用selectSingleNode单个node 取得msglist node的指针 然后用selectNodes取得List然后遍历
LIst中的各个属性得到值。
7.这里的请求空间都是传的单*的地址,是在函数内部实现空间的申请的,所以当该指针不用的时候需要释放,调用Release方法。
8.<data Name=“changjiang”, ID = “1”>这种是通过get_attributes获取值的。
#include "stdafx.h"
#include <windows.h>
using namespace MSXML2;
int main(int argc, char* argv[])
{
VARIANT vXMLSrc;
CoInitialize(NULL);
IXMLDOMDocumentPtr pXmlDoc;
IXMLDOMElement *iXMLElm = NULL;
IXMLDOMNodeList *iXMLChild = NULL;
IXMLDOMNode* iXMLItem = NULL;
IXMLDOMNode* iXMLTrmpItem = NULL;
IXMLDOMNode* pAttrTmp=NULL;
IXMLDOMNamedNodeMap *pAttrMap=NULL;
HRESULT hr = pXmlDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
pXmlDoc->put_async(VARIANT_FALSE);
pXmlDoc->put_validateOnParse(VARIANT_FALSE);
pXmlDoc->put_resolveExternals(VARIANT_FALSE);
VARIANT_BOOL result;
VariantInit( &vXMLSrc );
vXMLSrc.vt = VT_BSTR;
vXMLSrc.bstrVal = SysAllocString(L"test.xml");
if(pXmlDoc->load(vXMLSrc,&result) != VARIANT_TRUE)
{
pXmlDoc->selectSingleNode(L"msglist",&iXMLItem);
iXMLItem->selectNodes(L"data",&iXMLChild);
// wchar_t* bStr = NULL;
// iXMLItem->get_text(&bStr);
long lLength = 0;
iXMLChild->get_length(&lLength);
for (int x=0;x<lLength;x++)
{
iXMLChild->get_item(x,&iXMLTrmpItem);
// iXMLTrmpItem->get_attributes(&pAttrMap);
// pAttrMap->getNamedItem(L"Name",&pAttrTmp);
wchar_t* bStr = NULL;
iXMLTrmpItem->selectSingleNode(L"Name",&iXMLItem);
iXMLItem->get_text(&bStr);
iXMLItem->Release();
iXMLItem = NULL;
iXMLTrmpItem->selectSingleNode(L"ID",&iXMLItem);
iXMLItem->get_text(&bStr);
// pAttrTmp->get_text(&bStr);
// pAttrMap->getNamedItem(L"ID",&pAttrTmp);
// bStr = NULL;
// pAttrTmp->get_text(&bStr);
}
return 0;
}
<msglist>
<data>
<Name>changjiang</Name>
<ID>1</ID>
</data>
<data>
<Name>wang</Name>
<ID>2</ID>
</data>
</msglist>
1.先要#Import<MSXML6.dll>
2.要添加命名空间
3.创建组件两种方式CreateInstance和CoCreateInstance,有的时候直接添加IID时候不能编译通过添加到 __uuidof(MSXML2::DOMDocument60)可以编过
4.设置相关属性 pXmlDoc->put_async(VARIANT_FALSE);
pXmlDoc->put_validateOnParse(VARIANT_FALSE);
pXmlDoc->put_resolveExternals(VARIANT_FALSE);
5.打开xml文件,在网上找的大部分是直接打开xml文件,我的编译不通过可能是用的msxml版本不同吧,
VariantInit( &vXMLSrc );
vXMLSrc.vt = VT_BSTR;
vXMLSrc.bstrVal = SysAllocString(L"test.xml");
设置打开相关文件
6.这样打开的指针式文件的指针我理解的其实每一个《》中的就是一个NODE,这是用文件指针pXmlDoc遍历data node是不可见的
所以要先指定<msglist> node 用selectSingleNode单个node 取得msglist node的指针 然后用selectNodes取得List然后遍历
LIst中的各个属性得到值。
7.这里的请求空间都是传的单*的地址,是在函数内部实现空间的申请的,所以当该指针不用的时候需要释放,调用Release方法。
8.<data Name=“changjiang”, ID = “1”>这种是通过get_attributes获取值的。
#include "stdafx.h"
#include <windows.h>
using namespace MSXML2;
int main(int argc, char* argv[])
{
VARIANT vXMLSrc;
CoInitialize(NULL);
IXMLDOMDocumentPtr pXmlDoc;
IXMLDOMElement *iXMLElm = NULL;
IXMLDOMNodeList *iXMLChild = NULL;
IXMLDOMNode* iXMLItem = NULL;
IXMLDOMNode* iXMLTrmpItem = NULL;
IXMLDOMNode* pAttrTmp=NULL;
IXMLDOMNamedNodeMap *pAttrMap=NULL;
HRESULT hr = pXmlDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
pXmlDoc->put_async(VARIANT_FALSE);
pXmlDoc->put_validateOnParse(VARIANT_FALSE);
pXmlDoc->put_resolveExternals(VARIANT_FALSE);
VARIANT_BOOL result;
VariantInit( &vXMLSrc );
vXMLSrc.vt = VT_BSTR;
vXMLSrc.bstrVal = SysAllocString(L"test.xml");
if(pXmlDoc->load(vXMLSrc,&result) != VARIANT_TRUE)
{
pXmlDoc->selectSingleNode(L"msglist",&iXMLItem);
iXMLItem->selectNodes(L"data",&iXMLChild);
// wchar_t* bStr = NULL;
// iXMLItem->get_text(&bStr);
long lLength = 0;
iXMLChild->get_length(&lLength);
for (int x=0;x<lLength;x++)
{
iXMLChild->get_item(x,&iXMLTrmpItem);
// iXMLTrmpItem->get_attributes(&pAttrMap);
// pAttrMap->getNamedItem(L"Name",&pAttrTmp);
wchar_t* bStr = NULL;
iXMLTrmpItem->selectSingleNode(L"Name",&iXMLItem);
iXMLItem->get_text(&bStr);
iXMLItem->Release();
iXMLItem = NULL;
iXMLTrmpItem->selectSingleNode(L"ID",&iXMLItem);
iXMLItem->get_text(&bStr);
// pAttrTmp->get_text(&bStr);
// pAttrMap->getNamedItem(L"ID",&pAttrTmp);
// bStr = NULL;
// pAttrTmp->get_text(&bStr);
}
return 0;
}
相关文章推荐
- 事件与委托---实现事件分发中心
- 卡尔曼滤波+opencv 实现跟踪人脸 小demo
- 模型
- AJAX 在IE 下提交到后台乱码,但ff不会
- session 讲解
- R绘图-坐标中断的柱状图
- CodeTyphon自带例子源码:限制运行日期
- ubuntu12.04下搭建android开发环境
- 数据库与MATLAB链接http://blog.sina.com.cn/s/blog_9d0b00a401012spy.html
- 如何增大UDP收包效率
- MongoDB 启动mongo不带DB
- c++ dirname() basename()
- 异常分类
- IntelliJ IDEA快捷键note
- 线程锁ReentrantLock和Condition的使用
- 反射的方法操作记事本添加插件
- 【FOJ2207 11月月赛C】【DFS栈性质应用 离线处理】以撒的结合 从x到y路径上的第k个点 询问众多
- Android 拖拉控件遇到的问题
- 90 Subsets II
- Poj 1734 Sightseeing trip floyd最小环