delphi实现删除XML结点

来源:互联网 发布:四班三倒倒班日历软件 编辑:程序博客网 时间:2024/06/06 19:11

 遇到了点问题,竟然没办法删除掉,到底是哪里出了问题呢???


删除一个结点的时候,需要定位到要删除的结点,而在定位到这个结点之前,可能因为有不少和这个结点是同等级的,也就是需要用结点的值来定位,在定位对同等级的结点之前,要定位到要删除的结点的父结点,也就是只要定位到要删除的结点的父结点,然后根据结点值,就可以搜索到要删除的结点了。



在网上找到一个算法,哇哈哈。


(2)删除结点
function removeNode(XMLName:string;proID:integer):integer;
var
  xmlDoc:IXMLDocument;
  rootNode,CNode,NNode:IXMLNode;
  iValue,iReturn:integer;
  sValue:string;
begin
  result := -1 ;
  if not fileExists(XMLName)then  exit;
  xmlDoc := TXMLDocument.Create(nil);
  xmlDoc.Active :=True;   iReturn:=-1;
  try
    try
     xmlDoc.LoadFromFile(XMLName) ;
     xmlDoc.Encoding :='GB2312';
     rootNode := xmlDoc.ChildNodes.FindNode('Document');
     CNode := rootNode.ChildNodes.FindNode('product');
     if CNode<>nil then
     begin
       iValue:=CNode.Attributes['proID'];
       while (proID<>iValue) and (CNode<>nil)do   //找某
       begin
         NNode := rootNode.ChildNodes.FindSibling(CNode,1);
         CNode := NNode;
         if CNode<>nil then iValue:=CNode.Attributes['proID'];
       end;

     end;
     if CNode<>nil thenrootNode.ChildNodes.Remove(CNode);  //找到,删除

     xmlDoc.SaveToFile(XMLName) ;
     iReturn := 0;
    except
     iReturn:=-1;
    end;
  finally
    xmlDoc :=nil ;
    result :=iReturn;
  end;
end;


不过还要改造一下才行,一点通用性都没有。设计这个算法的人还真是懒啊,另外,我还在PUDN上面发现了很多类似的算法,不过算了,试一下这个先吧。

并且,突然对XML的文法相当的感兴趣啊,我也要自己设计一个。而且算法也不复杂,使用栈就可以完成所有结点的配对检查。然后结点可以用一棵树来存储,根结点对应第一个结点,往下是叶子。

 

------------我是华丽的分割线-------------

<?xml version="1.0" encoding="GB2312"?>
<Params>
    <FileOperate>
        <Setting>
            <Type>0</Type>
            <SavePath>C:/U_0127</SavePath>
        </Setting>
        <History>
            <Path>C:/U_0127/Demo000002.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000360.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000361.csv</Path>
        </History>
    </FileOperate>
</Params>
-----------------我是华丽的分割线--------------

 

比如上面的XML,经过语法检查之后,生成的树应该是以下这样子的,并且使用链表来存储各个结点。

Param--
      |FileOperate--
                   |Setting--
                            |Type(0)
                            |SavePath(C:/U_0127)
                   |History--
                            |Path(C:/U_0127/Demo000002.csv)
                            |Path(C:/U_0127/Demo000362.csv)
                            |Path(C:/U_0127/Demo000362.csv)
                            |Path(C:/U_0127/Demo000360.csv)
                            |Path(C:/U_0127/Demo000362.csv)
                            |Path(C:/U_0127/Demo000361.csv)

 

 

这样子,对于树的各种操作:创建XML树,增加结点/结点属性,查询结点值/属性值,修改结点值/属性值,删除结点/结点属性,读入XML文件创建成XML树,输出XML树到文件


 

 

-----------------------我是华丽的分割线----------------

对于上面的XML文件,要将某个结点删除的算法为:

首先确定要删除的结点的路径,比如我要删除<Path>C:/U_0127/Demo000360.csv</Path>这个结点,

则可以确定其路径为:Params->FileOperate->History

然后,再查找结点History的子结点,只要查找到值为C:/U_0127/Demo000360.csv,就可以将其删除了。

删除后的XML文件为:

----------------我是华丽的分割线--------------

<?xml version="1.0" encoding="GB2312"?>
<Params>
    <FileOperate>
        <Setting>
            <Type>0</Type>
            <SavePath>C:/U_0127</SavePath>
        </Setting>
        <History>
            <Path>C:/U_0127/Demo000002.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000362.csv</Path>
            <Path>C:/U_0127/Demo000361.csv</Path>
        </History>
    </FileOperate>
</Params>
-----------------我是华丽的分割线--------------

一个完整的删除结点操作就这样完成了。


原创粉丝点击