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; 

相关阅读 >>

Delphi xe strpas 遇到的问题

Delphi操作excel说明

Delphi 直接将html字符串读入webbrowser中

Delphi 字符串分割

Delphi 关于构造方法的重写

Delphi uac相关代码

Delphi多线程tthread详解

Delphi 扫二维码并识别

Delphi清除ie临时文件,历史记录

Delphi 随便找个网站获取格林威治时间, 并转换到北京时间

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...