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