delphi实现删除XML结点

    技术2022-05-19  21

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

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

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

    (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 then rootNode.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> -----------------我是华丽的分割线--------------

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


    最新回复(0)