delphi基于html页面和xml实现表单填写,DELPHI 实现对XML文件的读写操作

本文提供了一组用于读取和设置XML文件中特定节点及其属性值的优化函数。这些函数支持通过路径和属性筛选目标节点,并允许修改节点内容或属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读XML节点(已经优化过的版本,可以直接COPY使用)

{-------------------------------------------------------------------------------

Fun/Pro:     GetXMLNodeSpecialValue

@Date:     2004.12.11

@Param:   xmlFile xml文件

@Param:   xmlnodepath 节点

@Param:   xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。

@Param:   XMLSpecialName 要查找的节点中属性名

@Param:   XMLSpecialValue 要查找的节点中某属性对应的值

@Param:   dep 节点的参数的分隔符,默认为.

@Return:     某属性的值

-------------------------------------------------------------------------------}

function GetXMLNodeSpecialValue(strEntityEngineFile:String; XMLNodePath:String;

const XMLAttrName:String=''; const XMLSpecialName:String=''; const XMLSpecialValue:String=''; const dep:Char ='.'):String;

var

xmlDocument :IXMLDocument;

node     :IXMLNode;

xmlnodeList :TStrings;

i       :Integer;

urlcount   :Integer;

begin

//xml节点路径

xmlnodeList:=TStringList.Create;

xmlnodeList.Delimiter:=dep;

xmlnodeList.DelimitedText:=xmlnodepath;

urlcount:=xmlnodeList.Count;

//xml对象

xmlDocument :=TXMLDocument.Create(nil);

xmlDocument.LoadFromFile(strEntityEngineFile);

xmlDocument.Active:=true;

try

node:= xmlDocument.DocumentElement;

if(node.NodeName = xmlnodeList[0]) then begin

//扫描节点

for i := 1 to urlcount-1 do begin

if(node<>nil) then

begin

node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList);

end

else Break;

end;

if(node=nil)then begin

result:='';

end else begin

//判断是取属性还是取节点内容

if(Trim(xmlattrname)='') then

result:=node.Text

else

begin

result := node.AttributeNodes.Nodes[XMLSpecialName].NodeValue; //这里不想再声明一个临时变量了,就用result来比较,可能有隐患。

while ((result <> XMLSpecialValue)) do

begin

node := node.NextSibling;

while (node.NodeName = '#comment') do

begin

node:= node.NextSibling;

end;

result := node.AttributeNodes.Nodes[XMLSpecialName].NodeValue;

end;

result:=node.AttributeNodes.Nodes[XMLAttrName].NodeValue;

end;

end;

end else begin

result:='';

end;

except

result:='error';

end;

xmlDocument.Active:=false;

end;

写函数 (已经优化过的版本,可以直接COPY使用)

{-------------------------------------------------------------------------------

Fun/Pro:     SetXMLNodeSpecialValue

@Date:     2004.12.11

@Param:   xmlFile xml文件

@Param:   xmlnodepath 节点

@Param:   xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。

@Param:   XMLSpecialName 要查找的节点中属性名

@Param:   XMLSpecialValue 要查找的节点中某属性对应的值

@Param:   dep 节点的参数的分隔符,默认为.

@Return:     操作成功与否

-------------------------------------------------------------------------------}

function SetXMLNodeSpecialValue(strEntityEngineFile:String; xmlNodePath:String;

const xmlattrname:String=''; const value:String=''; const XMLSpecialName:String=''; const XMLSpecialValue:String=''; const dep:Char ='.'):boolean;

var

xmlDocument :IXMLDocument;

node     :IXMLNode;

xmlnodeList :TStrings;

i       :Integer;

urlcount   :Integer;

CMPValue   :String;

begin

//xml节点路径

xmlnodeList:=TStringList.Create;

xmlnodeList.Delimiter:=dep;

xmlnodeList.DelimitedText:=xmlnodepath;

urlcount:=xmlnodeList.Count;

//xml对象

xmlDocument :=TXMLDocument.Create(nil);

xmlDocument.LoadFromFile(strEntityEngineFile);

xmlDocument.Active:=true;

try

node:= xmlDocument.DocumentElement;

if(node.NodeName = xmlnodeList[0]) then begin

//扫描节点

for i := 1 to urlcount-1 do begin

if(node<>nil) then

node := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList)

else Break;

end;

if(node <> nil)then begin

{if(Trim(xmlattrname)='') then

node.Text:=value

else

node.AttributeNodes.Nodes[xmlattrname].NodeValue:=value;

}

if (Trim(XMLAttrName)='') then

node.Text := value

else

begin

CMPValue := node.AttributeNodes.Nodes[XMLSpecialName].NodeValue;

while (CMPValue <> XMLSpecialValue) do

begin

node := node.NextSibling;

while (node.NodeName = '#comment') do

begin

node:= node.NextSibling;

end;

CMPValue := node.AttributeNodes.Nodes[XMLSpecialName].NodeValue;

end;

node.AttributeNodes.Nodes[XMLAttrName].NodeValue:=value;

end;

xmlDocument.SaveToFile(strEntityEngineFile);

end;

end;

result:=true;

except

result:=false;

end;

xmlDocument.Active:=false;

end;

网上很多用户反映getnodefromIXMLNodeList这个函数没有声明,现将该函数贴出来。做为上面帖子的补充

function getnodefromIXMLNodeList(childnodes:IXMLNodeList;nodename:String):IXMLNode;

var

i: Integer;

begin

for i :=1 to childnodes.Count do begin

if(childnodes.Get(i-1).NodeName = nodename) then begin

result:= childnodes[i-1];

exit;

end;

end;

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值