遇到了点问题,竟然没办法删除掉,到底是哪里出了问题呢???
删除一个结点的时候,需要定位到要删除的结点,而在定位到这个结点之前,可能因为有不少和这个结点是同等级的,也就是需要用结点的值来定位,在定位对同等级的结点之前,要定位到要删除的结点的父结点,也就是只要定位到要删除的结点的父结点,然后根据结点值,就可以搜索到要删除的结点了。
在网上找到一个算法,哇哈哈。
(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> -----------------我是华丽的分割线--------------
一个完整的删除结点操作就这样完成了。