以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XML源码及示例(仅原创和转载) 』  (http://bbs.xml.org.cn/list.asp?boardid=32)
----  贴一个vc++.net做的加载查询xml文件的例子  (http://bbs.xml.org.cn/dispbbs.asp?boardid=32&rootid=&id=16036)


--  作者:haomeng1999
--  发布时间:3/25/2005 2:39:00 PM

--  贴一个vc++.net做的加载查询xml文件的例子
里面有一个xml文件和xsl文件,xsl文件把xml文件格式化为html格式。
对xml的操作已经封装成类了
欢迎提出宝贵意见

但是,如何上传文件呢?


--  作者:haomeng1999
--  发布时间:5/18/2005 4:35:00 PM

--  
#pragma once

/*
 Author: 郝猛
 Date: 2005-03-25
*/
class CXMLWrapper
{
private:
 CComPtr<IXMLDOMDocument> spXMLDOM;// 代表配置文件文档指针
public:
 DWORD loadXMLDoc(
      const char * pchFilePath // [in]表示文件路径的参数
     );// 加载xml配置文件的函数

 DWORD findValue(  
      const char * pchType, // [in]类型,请参见xml配置文件,可以取4个值:apdu,file,usat,stat
      const char * pchId,  // [in]xml元素的id值,
      char * pchValue   // [out]需要得到的值
     );// 由健取对应值的函数
 CXMLWrapper(void);
 ~CXMLWrapper(void);
};
以上是头文件
#include "StdAfx.h"
#include ".\xmlwrapper.h"

#define   LENGTH_OF_XPATH   50
#define   LENGTH_OF_ID   10

/*
 Author: 郝猛
 Date: 2005-03-25
*/
CXMLWrapper::CXMLWrapper(void)
{
 HRESULT hr;
 // 初始化com库
 CoInitialize(NULL);
 
 // 创建dom文档实例
 hr=spXMLDOM.CoCreateInstance(_uuidof(DOMDocument));
}

/*
 Author: 郝猛
 Date: 2005-03-25
*/
CXMLWrapper::~CXMLWrapper(void)
{
 if( spXMLDOM.p != NULL )
  spXMLDOM.Release();
 CoUninitialize();
}

/*
 Author: 郝猛
 Date: 2005-03-25
*/
DWORD CXMLWrapper::loadXMLDoc( const char * pchFilePath )
{
 HRESULT hr;
 VARIANT_BOOL bSuccess=false;
 hr=spXMLDOM->load(CComVariant(pchFilePath),&bSuccess);
 if( hr == S_OK )
 {
  return 0;
 }
 else
  return 1;
}

/*
 Author: 郝猛
 Date: 2005-03-25
*/
DWORD CXMLWrapper::findValue(
        const char * pchType, // 输入参数:类型:
        const char * pchId,   // 输入参数:健值
        char * pchValue    // 输出参数:字符串值
        )
{
 CComQIPtr<IXMLDOMNodeList> spIDOMNodeList; // 结点列表
 CComQIPtr<IXMLDOMNodeList> spIDOMElementList;
 CComQIPtr<IXMLDOMNode> spIDOMNode;   // 单个结点
 CComQIPtr<IXMLDOMNode> spIDOMChildnode;  // 子结点
 CComQIPtr<IXMLDOMNode> spIXMLChildNode;  // 新的子结点,用于替换
 CComQIPtr<IXMLDOMNode> spIDOMChildelement; // 新的元素
 CComQIPtr<IXMLDOMElement> spXMLChildElement;

 CComBSTR bstrValue;
 
 long lNumber = 0;// 满足条件的节点数目
 long lNumElement = 0; // 满足条件的元素数目
 HRESULT hr;

 // 先查找该结点,如果类型为apdu那么结点名称为apduitem
 // 如果类型为usat,那么结点名称为usatitem
 // 先组合一个xpath,如果查询的apduitem节点的id属性为"B0"
 // 那么xpath表达式为:protocol/apdu/apduitem[@id='B0']
 //
 unsigned char chXPath[LENGTH_OF_XPATH] = "protocol/";
 unsigned char chXPath_temp[LENGTH_OF_XPATH] = "";
 unsigned char chTemp[LENGTH_OF_ID] = "";
 unsigned char chTemp_short[LENGTH_OF_ID] = "";
 char chStatvalue[3] = "";
 size_t  sizeLength = 0;

 if( pchType == NULL || pchId == NULL )
  return 1;
 
 try{
  // assemble the xpath statement
  strcat( (char *)chXPath, pchType ); // apdu, usat or file?
  strcat( (char *)chXPath, "/" );
  strcat( (char *)chXPath, pchType );
  strcat( (char *)chXPath, "item[@id='" );
  strcat( (char *)chXPath, pchId );
  strcat( (char *)chXPath, "']" );

  CComBSTR bstrXPath((LPCSTR)chXPath);// 转换成BSTR类型

  // xml文档已经载入,现在开始查找结点
  hr = spXMLDOM->selectNodes( bstrXPath, &spIDOMNodeList );
  SUCCEEDED(hr) ? 0 : throw hr;

  hr = spIDOMNodeList->get_length(&lNumber);// 得到符合要求的节点数目
  if( SUCCEEDED( hr ) )
  {
   if( lNumber != 1 )
    throw hr;
   hr = spIDOMNodeList->get_item(0, &spIDOMNode);
   if( SUCCEEDED( hr ) )
   {
    spIDOMNode->get_text(&bstrValue);
    USES_CONVERSION;

    strcpy( pchValue, W2T( bstrValue.m_str ) );

   }

  }
 
 }
 catch(...)
 {

  return 1;
 }

 return 0;

}
以上是cpp文件


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms