XML应用的实例!

狮子王啊 2003-06-24 03:38:04
谢谢各位给我的帮助!
加油啊!
...全文
49 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
狮子王啊 2003-06-24
  • 打赏
  • 举报
回复
执行效率还不错!不过好像xml文件超过500k,执行时间就有些长了,而xml文件如果用来存取数据的话,会很大啊!
datainfinger,改为线程的版本可以提供给大家吗???
狮子王啊 2003-06-24
  • 打赏
  • 举报
回复
万分感谢!!!
datainfinger 2003-06-24
  • 打赏
  • 举报
回复
噢,又可以贴了!
:-)
那就接着上回得吧!

实例2:用Treeview表现XML文件的树状结构,并在memo中显示所选的节点(node or item)的内容!

准备知识:
1) XMLDocument的使用方法
2) TreeView的使用方法
3) Memo的使用方法
请见Delphi帮助和其他案例!

实现步骤:
1)建立新项目和窗体,命名为LoadXML.dpr和frmMain;
2)注意包括以下几个必须的包:
SysUtils, xmldom, XMLIntf, msxmldom, XMLDoc, Variants;
3)建立以下主要控件:
tvXML: TTreeView; // Treeview representation the XML's tree structure
dlgOPen: TOpenDialog;
btnOpen: TButton;
imgMain: TImageList; // Stored the icon used on Treeview
XMLDoc: TXMLDocument;
chkExpTree: TCheckBox; // decide whether expand the tree node
chkDispText: TCheckBox;// decide whether display the value of xml node
rEdtNodeValue: TRichEdit;

4)建立以下私有变量:
myXMLNode: IXMLNode;
xmlRootNode: IXMLNode;
myRootNode: TTreeNode;
定义几个常量:
SYS_NAME = 'XML Data Manager System Version1.0';

XML_TEXT_TAG = '#text';
XML_CDATA_TAG = '#cdata-section';
XML_COMMENT_TAG = '#comment';

5) imgMain装载表示XML文件中节点类型的不同图标(我这里有,如有兴趣,请和datainfinger@163.com联系!):包括root, element, attribute, text, CDATA, entity, comment等几个主要节点类型;

6)为了比较简单的说明实现步骤,我把使用线程处理的代码去掉,直接放在VCL事件代码中:
i)打开指定的XML文件并装载!
procedure TfrmMain.btnOpenClick(Sender: TObject);
begin
dlgOpen.Execute;
try
XMLDoc.LoadFromFile(dlgOpen.FileName);
XMLDoc.Active := True;
tvXML.Items.Clear;
frmMain.Caption := 'Loaded:' + dlgOpen.FileName;
except
XMLDoc.Active := False;
ShowMessage('Load XML document error!');
end;
end;

ii)XML文件打开后,进行解析其树状结构!
procedure TfrmMain.XMLDocAfterOpen(Sender: TObject);
begin
var
dtS, dtE: TDateTime;
begin
dtS := Now();
// Get the root node of xml document!
xmlRootNode := XMLDoc.DocumentElement;
// Clear all items of TreeView and begin to add many items
frmMain.tvXML.Items.Clear;
frmMain.tvXML.Items.BeginUpdate;
myRootNode := frmMain.tvXML.Items.Add(nil, xmlRootNode.NodeName);

if frmMain.chkDispText.Checked then
CheckXMLNode(myRootNode, xmlRootNode, True)
else
CheckXMLNode(myRootNode, xmlRootNode, False);
frmMain.tvXML.Items.EndUpdate;

// Now the added items operation finished!
if frmMain.chkExpTree.Checked then
myRootNode.Expand(False);

dtE := Now();
frmMain.rEdtNodeValue.Text := 'Total using "' + TimeToStr(dtE-dtS) + '" seconds!';
end;

其中使用的函数CheckXMLNode()如下:
// --------------------------------------------------------- //
// Function Name: CheckXMLNode(myTreeNode:TTreeNode; myXMLNode: IXMLNode; bolDisplayText: Boolean): Boolean
// Description: Check the XML node which specified and get his own attributes and child's node information;
// Input Parameter: 1) myTreeNode: TTreeNode -- Current node of TreeView control
// 2) myXMLNode: IXMLNode -- Current node of XML document
// 3) bolDisplayText: Boolean -- Switch determined whether display the content of current XML node
// Output Parameter: None;
// Comment: 1) Current node is a leaf, then return and display me according my node type;
// 2) Current node has attribute or child nodes then continue check me as a tree;
// --------------------------------------------------------- //
procedure TCheckXMLDocThread.CheckXMLNode(myTreeNode:TTreeNode; myXMLNode: IXMLNode; bolDisplayText: Boolean);
var
xmlChildNode: IXMLNode;
xmlAttrNode: IXMLNode;
myChildNode: TTreeNode;
myAttrNode: TTreeNode;
i: Integer;
bolGetText: Boolean;
begin
// If current XML node hasn't any attribute nodes and child nodes then return!
if (myXMLNode.AttributeNodes.Count = 0) and (myXMLNode.ChildNodes.Count = 0) then
begin
if myXMLNode.NodeType = ntText then
begin
myTreeNode.ImageIndex := 3;
myTreeNode.SelectedIndex := 3;
end else if myXMLNode.NodeType = ntCData then
begin
myTreeNode.ImageIndex := 4;
myTreeNode.SelectedIndex := 4;
end else if myXMLNode.NodeType = ntComment then
begin
myTreeNode.ImageIndex := 7;
myTreeNode.SelectedIndex := 7;
end;
if bolDisplayText then
begin
if VarIsNull(myXMLNode.NodeValue) then
myTreeNode.Text := myXMLNode.NodeName + '="NULL"'
else
myTreeNode.Text := myXMLNode.NodeName + '="' + myXMLNode.NodeValue + '"';
end else
myTreeNode.Text := myXMLNode.NodeName;
exit;
end;

for i := 0 to myXMLNode.AttributeNodes.Count - 1 do
begin
xmlAttrNode := myXMLNode.AttributeNodes.Get(i);
if bolDisplayText then
begin
if VarIsNull(xmlAttrNode.NodeValue) then
myAttrNode := frmMain.tvXML.Items.AddChild(myTreeNode, xmlAttrNode.NodeName+'="NULL"')
else
myAttrNode := frmMain.tvXML.Items.AddChild(myTreeNode, xmlAttrNode.NodeName+'="'+xmlAttrNode.NodeValue+'"');
end else
myAttrNode := frmMain.tvXML.Items.AddChild(myTreeNode, xmlAttrNode.NodeName);
myAttrNode.ImageIndex := 5;
myAttrNode.SelectedIndex := 5;
end;

bolGetText := False;
xmlChildNode := myXMLNode.ChildNodes.First;
while(xmlChildNode <> nil) do
begin
if not bolGetText then
begin
myChildNode := frmMain.tvXML.Items.AddChild(myTreeNode, xmlChildNode.NodeName);
myChildNode.ImageIndex := 2;
myChildNode.SelectedIndex := 2;
if xmlChildNode.NodeType = ntText then
bolGetText := True;
end;
if bolDisplayText then
CheckXMLNode(myChildNode, xmlChildNode, True)
else
CheckXMLNode(myChildNode, xmlChildNode, False);
xmlChildNode := xmlChildNode.NextSibling;
end;
end;

7)大功告成!!!以上代码在Delphi6.0+WindowsXP中编译通过!请指正!

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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