如何使用MSXML读XML?

ldtiger 2013-10-24 09:50:14
XML内容为
<root1>
<root2>
<data1>11111</data1>
<data2>22222</data2>
</root2>
<root2>
<data1>33333</data1>
<data2>44444</data2>
</root2>
<root2>
<data1>55555</data1>
<data2>66666</data2>
</root2>
.
.
</root1>


请问如何获取到这些值?网上找了代码能获取到但是我修改的时候估计是指针指向的问题,总是失败。谁能帮我看看怎么改

::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr pDoc;

HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));//创建一个com进程

if(!SUCCEEDED(hr))
{
MessageBox(_T("failure"));
}

pDoc->load("XMLTEST.XML");
MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;
pNodeList = pDoc->selectNodes("//root1/root2");
MSXML2::IXMLDOMNodePtr pSubNode;

CString strTemp;
for(int i=0;i<pNodeList->Getlength();i++)
{
pSubNode=pNodeList->nextNode()->selectSingleNode("data1");
_bstr_t strRequestType=pSubNode->Gettext();
strTemp=strRequestType.operator char *();
MessageBox(strTemp);


}
pDoc->save("XMLTEST.XML");
::CoUninitialize();
...全文
195 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
秃头披风侠 2013-10-25
  • 打赏
  • 举报
回复
楼主还是应该自己多看看啊, XML的基本操作并不多 再给你个代码片段吧, 能够读取指定的节点, 不多对于复杂的XML结构以及同名节点的读取,请自己设计下
    MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild(); 

    // find the sub node "root2"
    MSXML2::IXMLDOMNodePtr pNode = pRoot->selectSingleNode("root2"); 

    // find sub node "XXX1"
    pNode = pNode->selectSingleNode("XXX1"); 

    // get node "XXX1"'s value
    VARIANT varVal;
    pNode->get_nodeTypedValue(&varVal); 
    std::cout << (char*)(_bstr_t)varVal << std::endl;
好好看下上面提到的几篇文章, 其实都很简单的
ldtiger 2013-10-25
  • 打赏
  • 举报
回复
引用 11 楼 WhiteBird99 的回复:
楼主还是应该自己多看看啊, XML的基本操作并不多

再给你个代码片段吧, 能够读取指定的节点, 不多对于复杂的XML结构以及同名节点的读取,请自己设计下

    MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild(); 

// find the sub node "root2"
MSXML2::IXMLDOMNodePtr pNode = pRoot->selectSingleNode("root2");

// find sub node "XXX1"
pNode = pNode->selectSingleNode("XXX1");

// get node "XXX1"'s value
VARIANT varVal;
pNode->get_nodeTypedValue(&varVal);
std::cout << (char*)(_bstr_t)varVal << std::endl;


好好看下上面提到的几篇文章, 其实都很简单的


引用 11 楼 WhiteBird99 的回复:
楼主还是应该自己多看看啊, XML的基本操作并不多

再给你个代码片段吧, 能够读取指定的节点, 不多对于复杂的XML结构以及同名节点的读取,请自己设计下

    MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild(); 

// find the sub node "root2"
MSXML2::IXMLDOMNodePtr pNode = pRoot->selectSingleNode("root2");

// find sub node "XXX1"
pNode = pNode->selectSingleNode("XXX1");

// get node "XXX1"'s value
VARIANT varVal;
pNode->get_nodeTypedValue(&varVal);
std::cout << (char*)(_bstr_t)varVal << std::endl;


好好看下上面提到的几篇文章, 其实都很简单的




我按照你贴的代码去改了,可是好像有异常,是我改的不对吗?麻烦你再帮我看看
::CoInitialize(NULL);
MSXML2::IXMLDOMDocumentPtr pDoc;

pDoc->load("BanlanceConfig.XML");
MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild();

// find the sub node "root2"
MSXML2::IXMLDOMNodePtr pNode = pRoot->selectSingleNode("BanlancePoint");

// find sub node "XXX1"
pNode = pNode->selectSingleNode("Index");

// get node "XXX1"'s value
VARIANT varVal;
pNode->get_nodeTypedValue(&varVal);
MessageBox((LPCTSTR)(_bstr_t)varVal);


XML内容如下:

我个人理解是取出第一个节点里面的Index的值,就是0
ldtiger 2013-10-24
  • 打赏
  • 举报
回复
补充一点。是能获取到里面的data1,就是1111,33333,55555这些。刚刚少打了
super_admi 2013-10-24
  • 打赏
  • 举报
回复
呵呵。现在的人,表述能力咋这么弱呢?以后怎么和客户沟通?
打你屁屁 2013-10-24
  • 打赏
  • 举报
回复
用TinyXml或者CMarkUp都可以啊
ldtiger 2013-10-24
  • 打赏
  • 举报
回复
引用 8 楼 WhiteBird99 的回复:
[quote=引用 6 楼 ldtiger 的回复:] 多谢你的回答。但是我想请问有没有办法能通过条件获取。就是比如说我要获取data1和data3的值。 [/img]
当然可以 http://www.cppblog.com/Lee7/archive/2009/06/13/87599.html[/quote]
引用 8 楼 WhiteBird99 的回复:
[quote=引用 6 楼 ldtiger 的回复:] 多谢你的回答。但是我想请问有没有办法能通过条件获取。就是比如说我要获取data1和data3的值。 [/img]
当然可以 http://www.cppblog.com/Lee7/archive/2009/06/13/87599.html[/quote] 额额额。我表示我看不懂。能不能麻烦你贴个代码给我参考。我主要是想实现循环取出root2中的值【data1、data2...对应的内容】,然后一个一个显示出来。就是取出111、222、XXX、333、444、XXX... PS.另一帖子已结贴给分。请查收
ztenv 版主 2013-10-24
  • 打赏
  • 举报
回复
引用 7 楼 ldtiger 的回复:
[quote=引用 5 楼 lianshaohua 的回复:] tinyxml比微软提供的好用的多,建议试试
我没接触过XML。tinyxml是不是还需要下载?[/quote] 嗯,下载一个很小的库,可编译为静态的库,然后你静态编译到你的程序内部即可,网上有大把大把的资料,找找吧
秃头披风侠 2013-10-24
  • 打赏
  • 举报
回复
引用 6 楼 ldtiger 的回复:
多谢你的回答。但是我想请问有没有办法能通过条件获取。就是比如说我要获取data1和data3的值。 [/img]
当然可以 http://www.cppblog.com/Lee7/archive/2009/06/13/87599.html
ldtiger 2013-10-24
  • 打赏
  • 举报
回复
引用 5 楼 lianshaohua 的回复:
tinyxml比微软提供的好用的多,建议试试
我没接触过XML。tinyxml是不是还需要下载?
ldtiger 2013-10-24
  • 打赏
  • 举报
回复
引用 4 楼 WhiteBird99 的回复:
最近因为在做相关的东西,所以才研究了下, 下面的代码基本符合你的要求,不过仍需要根据自己的需求修改.
void ReadXML(MSXML2::IXMLDOMElementPtr pRoot)
{

MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes();
int nodeCount = pNodeList->length;

if (nodeCount > 1)
{
MSXML2::IXMLDOMElementPtr xmlNode;
for (int i = 0; i < nodeCount; i++)
{
xmlNode = pNodeList->item[i];
ReadXML(xmlNode);
}

xmlNode.Release();
}
else
{
std::cout << (char*)pRoot->nodeName << ": ";
VARIANT varVal;
pRoot->get_nodeTypedValue(&varVal);
std::cout << (char*)(_bstr_t)varVal << std::endl;
}

pNodeList.Release();
}

int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);

MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if (FAILED(hr))
{
return 0;
}

if (!pDoc->load("C:\\1.xml"))
{
pDoc.Release();
::CoUninitialize();
return 0;
}

MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild();

ReadXML(pRoot);

pRoot.Release();
pDoc.Release();

::CoUninitialize();

system("pause");
return 0;
}


XMl的内容为:
<root1>
<root2>
<XXX1>11</XXX1>
<XXX2>22</XXX2>
</root2>
<root3>
<XXX1>33</XXX1>
<XXX2>44</XXX2>
</root3>
<root3>
<XXX1>55</XXX1>
<XXX2>66</XXX2>
</root3>
</root1>


另外推荐楼主看这几篇, 之后基本的xml操作应该没问题:
http://chuansu.iteye.com/blog/1445628
http://bbs.csdn.net/topics/60016534
http://blog.csdn.net/loveandangle/article/details/6639901



多谢你的回答。但是我想请问有没有办法能通过条件获取。就是比如说我要获取data1和data3的值。

XML内容如下
ztenv 版主 2013-10-24
  • 打赏
  • 举报
回复
tinyxml比微软提供的好用的多,建议试试
秃头披风侠 2013-10-24
  • 打赏
  • 举报
回复
最近因为在做相关的东西,所以才研究了下, 下面的代码基本符合你的要求,不过仍需要根据自己的需求修改.
void ReadXML(MSXML2::IXMLDOMElementPtr pRoot)
{

    MSXML2::IXMLDOMNodeListPtr pNodeList = pRoot->GetchildNodes();
    int nodeCount = pNodeList->length;

    if (nodeCount > 1)
    {
        MSXML2::IXMLDOMElementPtr xmlNode;
        for (int i = 0; i < nodeCount; i++)
        {
            xmlNode = pNodeList->item[i];
            ReadXML(xmlNode);
        }

        xmlNode.Release();
    }
    else
    {
        std::cout << (char*)pRoot->nodeName << ": ";
        VARIANT varVal;
        pRoot->get_nodeTypedValue(&varVal);
        std::cout << (char*)(_bstr_t)varVal << std::endl;
    }
    
    pNodeList.Release();
}

int _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);

    MSXML2::IXMLDOMDocumentPtr pDoc;
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
    if (FAILED(hr))
    {
        return 0;
    }

    if (!pDoc->load("C:\\1.xml"))
    {
        pDoc.Release();
        ::CoUninitialize();
        return 0;
    }
    
    MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetfirstChild();

    ReadXML(pRoot);

    pRoot.Release();
    pDoc.Release();

    ::CoUninitialize();

    system("pause");
	return 0;
}
XMl的内容为:
<root1>
  <root2>
    <XXX1>11</XXX1>
    <XXX2>22</XXX2>
  </root2>
  <root3>
    <XXX1>33</XXX1>
    <XXX2>44</XXX2>
  </root3>
  <root3>
    <XXX1>55</XXX1>
    <XXX2>66</XXX2>
  </root3>
</root1>
另外推荐楼主看这几篇, 之后基本的xml操作应该没问题: http://chuansu.iteye.com/blog/1445628 http://bbs.csdn.net/topics/60016534 http://blog.csdn.net/loveandangle/article/details/6639901

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧