Delphi xml 读写

XML 语法纲要
1、忽略空白
2、注释: <!-- -->
3、指令: <? ?>
4、特殊字符: < > ' " &  替代: &lt; &gt; &apos; &quot; &amp;
5、二进制数据: <![CDATA [...]]>
6、区分大小写
7、标记不能交叠
8、单标记, 也就是空元素, 如: <node/>, 只用属性记录数据
9、属性值在引号内
10、xml 中的元素与属性的名字, 必须以字母或 _ 开头, 后面可以是字母、数字或 _ - : . 的组合, 但不能使用 xml 开始.
11、文件头包含版本与字符编码, 
    如: <?xml version="1.0" encoding="UTF-8"?>、<?xml version="1.0" encoding="gb2312"?>
1、TXMLDocument 适用于内存中操作和建立新的 xml
2
、一个 TXMLDocument 文档其实就是一个节点集合
3
、每个节点包括名称、文本内容、属性集合、子节点集合
4
、可以按位置或名称访问节点
5
、每一个节点都是一个 IXMLNode 对象
6
、每一个节点下包含的节点集合是一个 IXMLNodeList 对象, 用节点的 ChildNodes 属性获取
7
、根节点 XMLDocument1.DocumentElement 也是一个 IXMLNode 对象
8
、XMLDocument1.DocumentElement.ChildNodes 是一个 IXMLNodeList 对象, 访问一般从这里开始
9、可以把属性认为成横向的节点
读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[i]); 
               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[i]) 
               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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值