古詩詞大全網 - 成語故事 - 如何在delphi中實現xml

如何在delphi中實現xml

讀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;