有人说,Delphi对msxml.dll做了封装,对xml控件做了简单化,更容易编程!我觉得delphi的控件,牺牲了很多msxml.dll的有用的方法和属性!大家是怎么看的!谁有简单的原代码可以offer的吗??我在程序里面使用导入库做的,结果load XML文件的时候就报错!访问冲突!怎么回事?万分感谢!!!!!!!!!!!!!
解决方案 »
- 已知文件路径,怎么实现windows桌面那种效果(用大图标显示,并且能执行的)
- 请问大家我想把数据库数据存为一个文件,哪种格式比较好用?
- 如何连接VF 6.0 的数据库不通过ODBC
- 明白人给我看看代码~有错误~UP者有分~弄明白的话再给些分也无所谓~
- 请教各位:如何用delphi实现把powerpoint幻灯片以图片的形式分页存储。
- 程序员兄弟,从昨天早上醒来,到昨晚睡觉.你一天都做了什么?有兴趣的回忆一下
- 菜鸟问题:找一个将浮点型数据转化为整型的函数(在线等待)
- 谁有能连接ACTIVEMQ的组件
- (紧急求救)DBGrid组件中数据光标的问题
- crc16的校验代码怎么对2位数据校验呢?
- 一个关于ListView组件的问题
- 过年了,发分了(系列,100分)请大家来说说”递归“是什么东西
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;type
TfrmXML = class(TForm)
XMLDocument1: TXMLDocument;
XMLDocument2: TXMLDocument;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frmXML: TfrmXML;
n1,n2,n3: IXMLNode;implementation{$R *.dfm}procedure TfrmXML.Button1Click(Sender: TObject);
begin
XMLDocument1.loadfromfile('c:\a.xml');
XMLDocument1.Active:=true;
Memo1.Lines.Clear;
n1:=XMLDocument1.DocumentElement;
if n1=Nil then exit;
Memo1.Lines.Add(n1.NodeName);
n2:=n1.ChildNodes.Last;
if N2=Nil then exit;
Memo1.Lines.Add(n2.NodeName);
n3:=n2.ChildNodes.First;
while N3<>Nil do
begin
Memo1.Lines.Add(N3.Attributes['OrderNo']
+N3.Attributes['ItemNo']+' '
+N3.Attributes['PartNo']+' '
+N3.Attributes['Qty']+' '
+N3.Attributes['Discount']);
N3:=n3.NextSibling;
end;
XMLDocument1.Active:=false;
end;procedure TfrmXML.Button2Click(Sender: TObject);
var
i: Integer;
begin
XMLDocument2.Active:=True;
XMLDOcument2.Encoding:='GB2312';
n1:=XMLDocument2.AddChild('单订项数据');
for i:=3 to Memo1.Lines.Count do
N1.AddChild('X'+IntToStr(i));
XMLDocument2.SaveToFile('d:\output.xml');
XMLDocument2.Active:=false;
end;end.
要充分挖掘VCL的潜力,如果VCL的确处理不了,你可以考虑自己写XML解析。
当然,要看开发者的意愿,如果非要自己写解析,也可以。
这里有简单的例子,这里其实重要用了XML的接口,如果要实现更加复杂的操作,就要付出很大的代价,不过如果程序结构合理,这种方法也是不错的。
由于我的实际工作中用了XML Data Banding,所以我觉得快速开发中Data Banding的确是不错的选择。
下面的代码是简单的XML解析例子。unit UnitTest;interfaceuses
Classes, SysUtils, Forms, Dialogs, UnitMethod, UnitBookBuilder, XMLIntf,
ActiveX, XMLDoc; function CreateBookInfo: Boolean;
procedure FillData;
procedure InitData;//外部XML文件处理DLL需要用到的接口//////////////////////////////////////////////
//初始化DOM环境
procedure InitEnvironment();
function WriteInfo(pXMLNodeName: String;pXMLNodeText: String): Boolean;
function SaveXMLFile(xmlFileName: String): Boolean;
procedure XML_Exit();
////////////////////////////////////////////////////////////////////////////////implementationvar
xml: IXMLDocument;{$R BookInfo.res}procedure InitEnvironment();
begin
CoInitialize(nil);
xml := TXMLDocument.Create(nil);
end;procedure XML_Exit();
begin
CoUnInitialize();
end;function SearchNode(pXMLNodeList: IXMLNodeList;pXMLNodeName: String;pXMLNodeText: String): IXMLNode;
var
pXMLNode : IXMLNode;
ChildList: IXMLNodeList;
I : Integer;
begin
if(pXMLNodeList = nil)then//链表为空
begin
Result := nil;
exit;
end;
I := 0;
while I <= pXMLNodeList.Count - 1 do
begin
pXMLNode := pXMLNodeList.Get(I); if pXMLNodeName = pXMLNode.NodeName then
begin
pXMLNode.NodeValue := pXMLNodeText;
exit;
end; if pXMLNode.HasChildNodes then
begin
ChildList := pXMLNode.ChildNodes;//递归处理XML文件
SearchNode(ChildList,pXMLNodeName,pXMLNodeText);
end;
Inc(I);
end;
end;function WriteInfo(pXMLNodeName: String;pXMLNodeText: String): Boolean;
begin
SearchNode(xml.ChildNodes,pXMLNodeName,pXMLNodeText);
Result := True;
end;function SaveXMLFile(xmlFileName: String): Boolean;
begin
xml.SaveToFile(xmlFileName);
Result := True;
end;end.
二位的原代码我以逐行扫描过了!收益不少!
我首先问问你们有用过XPath的吗?
就我以前做过VB和XML项目的经验来说,我更觉得更喜欢直接使用SelectNode和SelectNodes来得到一个节点!而XML的VCL里面没有这个方法,请问你们是如何使用vcl里面的现有方法快速得到一个节点或者其下的子节点的呢?谢谢先!或者再给个详细点的列子!谢谢先!!!
XMLDocument了D6-7都有的http://www.csdn.net/develop/read_article.asp?id=12428