新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   >>中国XML论坛<<     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML编辑器,XML解析器,XML开发环境
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML工具及XML开发环境 』 → VC++中利用MSXML解析XML文档 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 15413 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: VC++中利用MSXML解析XML文档 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     JamesHou 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:58
      门派:XML.ORG.CN
      注册:2004/9/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给JamesHou发送一个短消息 把JamesHou加入好友 查看JamesHou的个人资料 搜索JamesHou在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看JamesHou的博客楼主
    发贴心情 VC++中利用MSXML解析XML文档

    原 出 处:不详
    发布类型:转载

      摘 要:XML文档是近年来比较流行的结构化文档形式,其主要用途不只适用于开发网页,而且在其他场合也有很广泛的应用。本文主要介绍用VC++开发应用程序时对XML文档的解析。
      关键词: XML HTML SGML COM DOM

      一、 XML 简介
      XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功能,但摒弃了SGML的复杂性。XML规范的第一份草稿于1996年11月发布后不久,1997年1月首个XML解析器就面世了。随后,便出现了XML的应用以及新的规范和解析器。
      HTML(Hypertext Markup Language)语言是大家所熟悉的开发网页的一种标记语言,但它不是一种编程语言,它的主要标记是针对文档内容本身结构的描述,因机器本身是不能够解析它的内容的。XML语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大减小了SGML的复杂性。它不仅能表示文档的内容,而且可以表示文档的结构,这样在能够被人类理解的同时,也能够被机器所理解。虽然HTML是SGML的一个应用,XML是SGML的一个子集,但是XML绝不是在HTML上添加某些元素而形成的,它们之间是有很大区别的。最大的区别就是XML允许使用者为某种特殊目的而定义自已的元素。除此之外,另一个最主要的区别就是XML致力解决的问题,正是在使用HTML时所遇到的一些特殊问题。
      XML要求遵循一定的严格标准,其分析程序比HTML浏览器对语法和结构的要求更加严格。XML文档每次分析的结果都一致,而HTML在不同的浏览器中可能会作出不同的分析和显示。同时,XML标准是对数据的处理应用,而不只是针对Web页的,它还可涉及到数据库电子商务系统,以及任何显示系统的高级应用。开发者可根据特定的工业需求,利用XML创建自定义的数据结构。这些数据结构和数据库可以在许多设备上查看,而不需要使用自定义的接口在不同的显示设备上查看相同的数据。
      XML主要有三个要素:文档类型声明(DTD:Document Type Declaration)或XML Schema(XML大纲)、可扩展样式语言(XSL:eXtensible Stylesheet Language)和可扩展链接语言(XLink:eXtensible Link Language)。DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素与元素属性之间的关系;Namespace(名域)实现了统一的XML文档数据表示以及数据的相互集成;XSL是用于规定XML文档呈现样式的语言,它使得数据与其表现形式相互独立,比如XSL能使Web浏览器改变文档的表示法,如数据显示顺序的变化,不需要再与服务器进行通讯。通过改变样式表,同一个文档可以显示得更大,或者经过折叠只显示外面的一层,或者可以变为打印的格式。而XLink 将进一步扩展目前Web上已有的简单链接。

      二、文档对象模型(DOM)
      DOM是Document Object Model(文档对象模型)的简称,是对Web文档进行应用开发、编程的应用程序接口(API)。作为W3C公布的一种跨平台、与语言无关的接口规范,DOM提供了在不同环境和应用中的标准程序接口,可以用任何语言实现。
      DOM采用对象模型和一系列的接口来描述XML文档的内容和结构,即利用对象把文档模型化。这种对象模型实现的基本功能包括:
      ● 描述文档表示和操作的接口;
      ● 接口的行为和属性;
      ● 接口之间的关系以及互操作。
      DOM可对结构化的XML文档进行解析,文档中的指令、元素、实体、属性等所有内容个体都用对象模型表示,整个文档被看成是一个有结构的信息树,而不是简单的文本流,生成的对象模型就是树的节点,对象同时包含了方法和属性。因此,对文档的所有操作都是在对象树上的进行。在DOM中,树中的一切都是对象,不管是根节点还是实体的属性。
      在DOM中主要有以下三个对象:
      ● XML文档对象 XML文档既是一种对象,同时又代表整个XML文档。它由根元素和子元素组成。
      ● XML节点对象 XML节点对象代表的是XML文档内部的节点,如元素、注释、名字空间等。
      ● XML节点列表 XML文档模块列表代表了节点的集合。
      利用DOM,开发人员可以动态地创建XML文档,遍历结构,添加、修改、删除内容等。其面向对象的特性,使人们在处理XML解析相关的事务时节省大量的精力,是一种符合代码重用思想的强有力编程工具。

      三、MSXML
      从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但实际上微软已经给我们提供了一个XML语法解析器,即一个叫做MSXML.DLL的动态链接库,实际上它是一个COM(Component Object Model)对象库,里面封装了进行XML解析时所需要的所有对象。因为COM是一种以二进制格式出现的和语言无关的可重用对象,所以你可以用任何语言(比如VB,VC,DELPHI,C++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
      MSXML.DLL所包括的主要COM接口有:
      1. DOMDocument
      DOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点,它实现了DOM文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。
      2. IXMLDOMNode
      IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode。事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
      3. IXMLDOMNodeList
      IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for...next"结构来遍历所有的节点。
      4. IXMLDOMParseError
      IXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号、行号、字符位置和文本描述。
      在具体应用时可以用DOMDocument的Load方法来装载XML文档,用IXMLDOMNode 的selectNodes(查询的结果有多个,得到存放搜索结果的链表)或selectSingleNode(查询的结果有一个,在有多个的情况下返回找到的第一个节点)方法进行查询,用createNode和appendChild方法来创建节点和追加节点,用IXMLDOMElement的setAttribute和getAttribute方法来设置和获得节点的属性。

      四、程序实现
      下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档。
      (1)源XML文档(xmlfile.xml)如下:
      <?xml version="1.0" encoding="GB2312"?>
      <Device id="10041" name="设备1">
      <Type>13</Type>
      <TypeName>保护</TypeName>
      </Device>
      我们在源文档中查找"Device",将其"name"属性设置为"测试设备",为其添加"Model"节点,并设置其文本为"3"。
      (2)源程序如下:
      CoInitialize(NULL); // 初始化COM。
      CComPtr<IXMLDOMDocument> spXMLDOM;
      HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
      // 创建解析器实例。
      VARIANT_BOOL bSuccess=false;
      hr=spXMLDOM->load(CComVariant(L"xmlfile.xml"),&bSuccess);
      // 装载XML文档。
      CComBSTR bstrSS(L"Device");
      CComPtr<IXMLDOMNode> spDevice;
      hr=spXMLDOM->selectSingleNode(bstrSS,&spDevice); //搜索"Device"。
      CComQIPtr<IXMLDOMElement> spDev;
      spDev=spDevice;
      // 设置"Device"的"name"属性。
      hr= spDev ->setAttribute(CComBSTR(L"name"),CComVariant("测试设备"));
      CComPtr<IXMLDOMNode> spModelNode; hr=spXMLDOM->createNode(CComVariant(NODE_ELEMENT),ComBSTR
      ("Model"),NULL,& spModelNode); // 创建"Model"节点。
      CComPtr<IXMLDOMNode> spInsertedNode;
      hr=spDevice->appendChild (spModelNode,&spInsertedNode);
      // 添加新节点到"Device"节点下面。
      CString strID="3";
      hr=spInsertedNode->put_text(strID.AllocSysString());// 设置"Model"的文本。
      hr=spXMLDOM->save(CComVariant("xmlfile.xml")); / /保存文档。
      CoUninitialize(); // 结束对COM的使用。
      因为篇幅的原因,上述代码的每步操作并未对返回的HRESULT类型进行判断,也未进行异常的捕获处理,在实际的编程中读者应根据返回的hr进行决断,以决定程序的流程,同时应进行异常的捕获处理。
      (3) 修改后的XML文档如下
      <?xml version="1.0" encoding="GB2312"?>
      <Device id="10041" name="测试设备">
      <Type>13</Type>
      <TypeName>保护</TypeName>
      <Model>3</Model>
      </Device>

      五、结束语
      因为XML文档有着比HTML更严格的语法要求,所以使用和编写一个XML解析器要比编写一个HTML解析器要容易得多。同时因为XML文档不仅可以标记文档的显示属性,更重要的是它标记了文档的结构和包含信息的特征,所以我们可以方便地通过XML解析器来获取特定节点的信息并加以显示或修改,方便了用户对XML文档的操作和维护。同时我们需要注意的是,XML是一种开放的结构体系,并不依赖于任何一家公司,所以开发基于XML的应用必然会得到绝大多数软件开发平台的支持。▲

                             参 考 文 献

      1 Natanya Pitts著, 徐晓梅 龚志翔 王晓云等译 . XML技术内幕 . 北京:机械工业出版社
      2 Dave Mercer著, 袁鹏飞译 . XML编程起步 . 北京:人民邮电出版社
      3 胡海璐 , 周涛武 .Visual C++.NET高级编程技术与范例 . 北京: 电子工业出版社


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/9/19 18:28:00
     
     fengji 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:57
      门派:XML.ORG.CN
      注册:2004/9/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给fengji发送一个短消息 把fengji加入好友 查看fengji的个人资料 搜索fengji在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看fengji的博客2
    发贴心情 
    CComPtr<IXMLDOMDocument> spXMLDOM;
      HRESULT hr=spXMLDOM.CoCreateInstance (_uuidof(DOMDocument));
      // 创建解析器实例。

    为什么创建解析器实例错误呢?就是运用上述代码。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/9/30 16:50:00
     
     zeki709 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:58
      门派:XML.ORG.CN
      注册:2004/12/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zeki709发送一个短消息 把zeki709加入好友 查看zeki709的个人资料 搜索zeki709在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zeki709的博客3
    发贴心情 
    我在使用时MSXML不能读取汉字属性,有没有谁知道怎么办?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/12/6 13:13:00
     
     Starplain 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:10
      积分:95
      门派:XML.ORG.CN
      注册:2005/4/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Starplain发送一个短消息 把Starplain加入好友 查看Starplain的个人资料 搜索Starplain在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Starplain的博客4
    发贴心情 
    兄弟,能否借阅一下你的源码,小弟急需,谢谢!!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/24 14:22:00
     
     luanyun0901 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:12
      积分:105
      门派:XML.ORG.CN
      注册:2005/4/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给luanyun0901发送一个短消息 把luanyun0901加入好友 查看luanyun0901的个人资料 搜索luanyun0901在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看luanyun0901的博客5
    发贴心情 
    哪位老大能告诉我怎么才能使msxml支持中文解析?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/28 14:57:00
     
     ldxd 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:79
      门派:XML.ORG.CN
      注册:2004/10/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ldxd发送一个短消息 把ldxd加入好友 查看ldxd的个人资料 搜索ldxd在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看ldxd的博客6
    发贴心情 
    大哥怎么配置MSXML4.0啊
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/8/16 15:45:00
     
     wFirebird 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:32
      积分:227
      门派:XML.ORG.CN
      注册:2006/1/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wFirebird发送一个短消息 把wFirebird加入好友 查看wFirebird的个人资料 搜索wFirebird在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wFirebird的博客7
    发贴心情 
    // MSXMLabelDlg.cpp : implementation file
    //

    #include "stdafx.h"
    #include "MSXMLabel.h"
    #include "MSXMLabelDlg.h"

    #include "tchar.h"
    #include "stdio.h"
    #import "msxml4.dll"
    using namespace MSXML2;

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App About

    class CAboutDlg : public CDialog
    {
    public:
     CAboutDlg();

    // Dialog Data
     //{{AFX_DATA(CAboutDlg)
     enum { IDD = IDD_ABOUTBOX };
     //}}AFX_DATA

     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(CAboutDlg)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
     //}}AFX_VIRTUAL

    // Implementation
    protected:
     //{{AFX_MSG(CAboutDlg)
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
     //{{AFX_DATA_INIT(CAboutDlg)
     //}}AFX_DATA_INIT
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CAboutDlg)
     //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
     //{{AFX_MSG_MAP(CAboutDlg)
      // No message handlers
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CMSXMLabelDlg dialog

    CMSXMLabelDlg::CMSXMLabelDlg(CWnd* pParent /*=NULL*/)
     : CDialog(CMSXMLabelDlg::IDD, pParent)
    {
     //{{AFX_DATA_INIT(CMSXMLabelDlg)
      // NOTE: the ClassWizard will add member initialization here
     //}}AFX_DATA_INIT
     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CMSXMLabelDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CMSXMLabelDlg)
     DDX_Control(pDX, IDC_LISTCTRL, m_listCtrl);
     //}}AFX_DATA_MAP
    }

    BEGIN_MESSAGE_MAP(CMSXMLabelDlg, CDialog)
     //{{AFX_MSG_MAP(CMSXMLabelDlg)
     ON_WM_SYSCOMMAND()
     ON_WM_PAINT()
     ON_WM_QUERYDRAGICON()
     ON_BN_CLICKED(IDOK, OnLoad)
     ON_BN_CLICKED(IDC_BTN_CLEAR, OnBtnClear)
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    /////////////////////////////////////////////////////////////////////////////
    // CMSXMLabelDlg message handlers

    BOOL CMSXMLabelDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();

     // Add "About..." menu item to system menu.

     // IDM_ABOUTBOX must be in the system command range.
     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
     ASSERT(IDM_ABOUTBOX < 0xF000);

     CMenu* pSysMenu = GetSystemMenu(FALSE);
     if (pSysMenu != NULL)
     {
      CString strAboutMenu;
      strAboutMenu.LoadString(IDS_ABOUTBOX);
      if (!strAboutMenu.IsEmpty())
      {
       pSysMenu->AppendMenu(MF_SEPARATOR);
       pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
      }
     }

     // Set the icon for this dialog.  The framework does this automatically
     //  when the application's main window is not a dialog
     SetIcon(m_hIcon, TRUE);   // Set big icon
     SetIcon(m_hIcon, FALSE);  // Set small icon
     
     // TODO: Add extra initialization here
     m_listCtrl.SetExtendedStyle(LVS_EX_GRIDLINES);
     m_listCtrl.SetBkColor(RGB(255,255,255));
     m_listCtrl.SetTextColor(RGB(0,0,0));
     m_listCtrl.SetTextBkColor(RGB(255,255,255));

     m_listCtrl.InsertColumn(0,"标签名",LVCFMT_LEFT,100);
     m_listCtrl.InsertColumn(1,"参数名",LVCFMT_LEFT,100);
     m_listCtrl.InsertColumn(2,"参数值",LVCFMT_LEFT,100);
     m_listCtrl.InsertColumn(3,"数据项",LVCFMT_LEFT,200);
     
     return TRUE;  // return TRUE  unless you set the focus to a control
    }

    void CMSXMLabelDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
     {
      CAboutDlg dlgAbout;
      dlgAbout.DoModal();
     }
     else
     {
      CDialog::OnSysCommand(nID, lParam);
     }
    }

    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.

    void CMSXMLabelDlg::OnPaint()
    {
     if (IsIconic())
     {
      CPaintDC dc(this); // device context for painting

      SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

      // Center icon in client rectangle
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
      GetClientRect(&rect);
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;

      // Draw the icon
      dc.DrawIcon(x, y, m_hIcon);
     }
     else
     {
      CDialog::OnPaint();
     }
    }

    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CMSXMLabelDlg::OnQueryDragIcon()
    {
     return (HCURSOR) m_hIcon;
    }

    void CMSXMLabelDlg::OnLoad()
    {
     CString pathName;
     CFileDialog OpenFile(TRUE);

     if (IDOK != OpenFile.DoModal())
     {
      MessageBox("请选择XML文档!");
      return;
     }
     pathName = OpenFile.GetPathName();

     HRESULT hr;
     MSXML2::IXMLDOMDocumentPtr pDoc = NULL;
     
     hr = CoInitialize(NULL);
     if (FAILED(hr))
     {
      AfxMessageBox("Initialize Failure");
      return;
     }

     hr = pDoc.CreateInstance("Msxml2.DOMDocument.4.0");
     if (FAILED(hr))
     {
      MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
      return ;
     }

     _variant_t varXml(pathName);
     _variant_t varOut((bool)TRUE);

     varOut = pDoc->load(varXml);
     if ((bool)varOut == FALSE)
     {
      // Show error description - IXMLDOMParseError sample.
      MSXML2::IXMLDOMParseErrorPtr errPtr = pDoc->GetparseError();
      // Print error details.
      CString string;
      string.Format("%L",errPtr->errorCode);
      MessageBox(string.GetBuffer(NULL),"出错代码");
      return ;
     }

     MSXML2::IXMLDOMElementPtr pElement = NULL;

     pElement = pDoc->documentElement;

     if(pElement == NULL)
     {
      AfxMessageBox("文档解析失败!");
      return;
     }
     
     BSTR str;
     pElement->get_tagName(&str);

     CString cStr(str);
     m_listCtrl.InsertItem(0,cStr);

    // str = pElement->Gettext();
    // cStr = str;
    // m_listCtrl.SetItemText(0,3,cStr);

     MSXML2::IXMLDOMNamedNodeMapPtr pAttributeMap = NULL;
     MSXML2::IXMLDOMNodePtr pAttributeNode = NULL;
     VARIANT varValue;
     
     pElement->get_attributes(&pAttributeMap);

     long num = pAttributeMap->length;

     for (int i = 0; i < num; i++)
     {
      pAttributeMap->get_item(i, &pAttributeNode);
      if (pAttributeNode)
      {
       str = pAttributeNode->nodeName;
       
       cStr = str;
       m_listCtrl.SetItemText(0,i + 1,cStr);

       pAttributeNode->get_nodeValue(&varValue);

       char strin[30];
       strcpy(strin, _bstr_t(varValue) );
       cStr = strin;
       m_listCtrl.SetItemText(0,i + 2,cStr);
      }
      
     }
      
     int k = 1;
     MSXML2::IXMLDOMNodeListPtr pNodeList = NULL;
     pElement->get_childNodes(&pNodeList);

     Parse(pNodeList,k);

     MessageBox(pElement->xml, _T("Document from its root"), MB_OK);
    }


    void CMSXMLabelDlg::Parse(MSXML2::IXMLDOMNodeListPtr pNodeList,int &k)
    {
     CString cStr;
     BSTR str;
     BSTR nodeName;
     MSXML2::IXMLDOMNodePtr pNode = NULL; 
     long num = pNodeList->length;

     for(int i = 0; i < num; i++)
     {
      pNodeList->get_item(i,&pNode);

      if (pNode)
      {
       MSXML2::IXMLDOMNamedNodeMapPtr pAttributeMap = NULL;
       MSXML2::IXMLDOMNodePtr pAttributeNode = NULL;
       VARIANT varValue;

       pNode->get_nodeName(&nodeName);
       cStr = nodeName;
       m_listCtrl.InsertItem(k,cStr);

       pNode->get_attributes(&pAttributeMap);

       long attribLength = 0;

       if (NULL != pAttributeMap)
       {
        attribLength = pAttributeMap->length;
       }
          
       if (attribLength)
       { 
        long attribLength = pAttributeMap->length;
        for (int j = 0; j < 1; j++)
        {
         pAttributeMap->get_item(j ,&pAttributeNode);
         
         str = pAttributeNode->nodeName;
         
         cStr = str;
         m_listCtrl.SetItemText(k, j + 1, cStr);
         
         pAttributeNode->get_nodeValue(&varValue);
         
         char strin[30];
         strcpy(strin, _bstr_t(varValue));
         cStr = strin;
         m_listCtrl.SetItemText(k, j + 2, cStr);
        }
       }
    //   MessageBox(cStr);
    //   cStr.Format("%d",k);
    //   MessageBox(cStr);

       k++;
       
       MSXML2::IXMLDOMNodeListPtr pNodeChild = NULL;
       
       if (SUCCEEDED(pNode->get_childNodes(&pNodeChild)))
       {
        Parse(pNodeChild,k);
       }
      }
     }
     
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/1/17 10:12:00
     
     cyclone575 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:80
      门派:XML.ORG.CN
      注册:2006/2/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cyclone575发送一个短消息 把cyclone575加入好友 查看cyclone575的个人资料 搜索cyclone575在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看cyclone575的博客8
    发贴心情 
    MSXML能在LINUX平台下使用吗?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/20 14:00:00
     
     ICBC_KEN 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2006/4/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给ICBC_KEN发送一个短消息 把ICBC_KEN加入好友 查看ICBC_KEN的个人资料 搜索ICBC_KEN在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看ICBC_KEN的博客9
    发贴心情 
    这种代码看了N遍了,谢谢
    请问无法创建DOMDocument对象该如何解决?
    falied to use the "FAILED(hr)" in your code
    can you tell me how to use the parser lib?thx
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/20 10:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML工具及XML开发环境 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/16 1:41:04

    本主题贴数9,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    7,843.262ms