如何读取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(); //滚动时刷新!
}