读取XML

如何读取xml文件?
<?xml   version= "1.0 "   encoding= "GB2312 "?> 
<vote   product_id= "YXTP "   count= "0 "   total= "0 "> 
    <key   id= "1 "   name= "1 "   count= "65 "   /> 
    <key   id= "2 "   name= "2 "   count= "36 "   /> 
    <key   id= "3 "   name= "3 "   count= "14 "   /> 
    <key   id= "4 "   name= "4 "   count= "24 "   /> 
</vote> 

如上:我要读取 
    <key   id= "1 "   name= "1 "   count= "65 "   /> 
    <key   id= "2 "   name= "2 "   count= "36 "   /> 
    <key   id= "3 "   name= "3 "   count= "14 "   /> 
    <key   id= "4 "   name= "4 "   count= "24 "   /> 
这些,具体怎么操作啊,给个例子

------解决方案--------------------------------------------------------
TXMLDocument类 
------解决方案--------------------------------------------------------
XMLDoc-> LoadFromFile(WideString( "playlist.xml ")); 
XMLDoc-> Active=true; 
_di_IXMLNode node=XMLDoc-> DocumentElement; 
_di_IXMLNodeList nodes=node-> ChildNodes; 

for(int n=0;n <nodes-> Count;n++) 

for(int j=0; j <nodes-> Nodes[n]-> ChildNodes-> Count; j++) 

if (String(nodes-> Nodes[n]-> ChildNodes-> Nodes[j]-> NodeName) == "filename ") 
Memo1-> Lines-> Add(nodes-> Nodes[n]-> ChildNodes-> Nodes[j]-> GetText()); 

【原创】BCB 操作XML文件[1] --------------读取XML文件信息2011-01-18 11:36BCB 读取XML文件内容

1,对于XML文件在此就不做太多的说明,只是说明在BCB中如何操作XML文件。


2,使用_di_IXMLDocument进行XML文件的操作;


3,添加头文件:#include <XMLDoc.hpp>

                          #pragma link "xmlrtl.lib"


4,打开XML文件  _di_IXMLDocument xml = LoadXMLDocument("D:\\123.xml");


5,遍历XML文件中的所有节点信息

   _di_IXMLNode root = xml->DocumentElement;//获得XML文件根节点

    _di_IXMLNodeList node_list = root->ChildNodes;//获取所有节点的集合

   _di_IXMLNode node;//定义一个xml节点变量

 

/*循环遍历输出接点的相关信息*/  

for(int i = 0; i < node_list->Count; i++)

  {

     node = node_list->Nodes[i]->ChildNodes->Nodes[0];

     mmo1->Lines->Add(node->NodeName + " :" + node->NodeValue);

  }

 

1.   Locate   支持多关键字搜索:如有一表: 
create   table     test   (   aa   char(10),bb   char(10)   ,cc   integer); 


    String   x1= "cccc ",x2= "张三 "; 
    TLocateOptions   o; 
    int   Bounds[2]   =   {0,2}; 
    Variant   A   =   VarArrayCreate(Bounds,1,   varVariant); 
    A.PutElement(x1,0); 
    A.PutElement(x2,1); 

    Query1-> Locate( "aa;bb; ",A,   o); 
2   可在记录中加一NO字段 
    每次locate后no加一,再用locate 

    Query1-> Locate( "no;aa;bb; ",A,   o); 
    no++; 
    ... 


DBGrid中的每个Column都有一个PickList属性,这个属性其实是一个TStringList,因此,可以通过在设计期指定该属性的值或者是在运行期动态指定都可以达到在DGrid的Column中输入数据的时候在单元格中显示一个下拉列表框的功能。 

BCB的DBGrid不支持鼠标滑轮滚动,只能点击ScrollBar的上下键移动,很不方便,下面使用替换窗口过程模拟上下键点击来支持滑轮滚动

代码编写者:妖哥


FARPROC pOldProc = NULL; // 用于保存DBGrid控件旧的WindowProc
//---------------------------------------------------------------------------
// DBGrid新的WindowProc
LRESULT CALLBACK DBGridProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    // 处理感兴趣的Window消息
    if (uMsg == WM_MOUSEWHEEL)
    {
        if ((short)HIWORD(wParam) > 0)
        {
            ::PostMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
        }
        else
        {
            ::PostMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
        }
    }
    // 调用原DBGrid的WindowProc
    return (::CallWindowProc(pOldProc, hWnd, uMsg, wParam, lParam));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormShow(TObject *Sender)
{
    // 设置新的窗体函数
    pOldProc = (FARPROC)::SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (long)DBGridProc);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
    // 还原窗体函数
    ::SetWindowLong(this->DBGrid->Handle, GWL_WNDPROC, (long)pOldProc);
}
本人封装的类:


#ifndef REPLACEPROC_H
#define REPLACEPROC_H

#include <windows.h>
#include <map>
using namespace std;

class ReplaceDBGridWndProc
{
    static map<HWND,WNDPROC> s_MapofOldProc;
    static WNDPROC s_OldWndProc;
    static LRESULT CALLBACK NewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        if (message == WM_MOUSEWHEEL)  
        {  
            if ((short)HIWORD(wParam) > 0)  
            {  
                ::PostMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);  
            }  
            else  
            {  
                ::PostMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);  
            }  
        }  
        map<HWND,WNDPROC>::iterator it=s_MapofOldProc.find(hwnd);
        LRESULT result;
        if(it!=s_MapofOldProc.end())
        result=CallWindowProc(it->second,hwnd,message,wParam,lParam);
        else
        result=DefWindowProc(hwnd,message,wParam,lParam);
        return result;   
    }
public:
    static void ReplaceWndProc(HWND hwnd)
    {
        s_MapofOldProc[hwnd]=(WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(LONG)NewWndProc);
    }

};
WNDPROC ReplaceDBGridWndProc::s_OldWndProc=NULL;
map<HWND,WNDPROC> ReplaceDBGridWndProc::s_MapofOldProc;
extern ReplaceDBGridWndProc g_ReplaceProc;
#endif


如果只是要隔行颜色显示,可试试:(d1   是   DBGrid   t1   是   Table   或   TQuery 
void   __fastcall   TForm1::d1DrawColumnCell(TObject   *Sender, 
            const   TRect   &Rect,   int   DataCol,   TColumn   *Column, 
            TGridDrawState   State) 

    static   myfirst=true,colchan=false; 
    static   colhei=0; 
    if   (myfirst) 
        { 
            myfirst=!myfirst; 
            oldrect=Rect; 
        } 
        if   ((!colchan)   &&   (Rect.Top!=oldrect.Top)) 
            { 
                  colchan=!colchan; 
                  colhei=Rect.Top-oldrect.Top; 
            } 

      if   (colhei==0) 
            d1-> Canvas-> Font-> Color=clHighlight; 
      else 
        { 
          if   ((Rect.Top/colhei)%2   ==0) 
            d1-> Canvas-> Font-> Color=clHighlight; 
          else 
                d1-> Canvas-> Font-> Color=clRed; 

        } 
//       if   (Column-> Field-> Text==2) 
  //       l1-> Items-> Add(Column-> Field-> Text); 
    /*   if   (Column-> Field-> Text%2   !=0) 
            d1-> Canvas-> Font-> Color=clHighlight; 
          else 
                d1-> Canvas-> Font-> Color=clRed;       */ 

      d1-> DefaultDrawColumnCell(Rect,DataCol,Column,State)   ; 

//--------------------------------------------------------------------------- 


void   __fastcall   TForm1::t1AfterScroll(TDataSet   *DataSet) 

      d1-> Refresh();   //滚动时刷新! 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值