2015-06-13 32 views
0

删除特定的XML元素我有一个XML文档看起来是这样的:在Delphi

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ExtensionData /> 
    <Name>ali</Name> 
    <Age>37</Age> 
    <Father> 
    <ExtensionData /> 
    <Name>I</Name> 
    <Age>72</Age> 
    </Father> 
    <Mother> 
    <ExtensionData /> 
    <Name>M</Name> 
    <Age>62</Age> 
    </Mother> 
</Person> 

我用Delphi 7

如何删除XML文档中的所有ExtensionData元素也是这样吗?

+0

为什么XML库是你?唱? –

+0

他可能使用默认的TXMLDocument包装。 –

+0

是的,我正在使用TXMLDocument。 – Mohamad

回答

4

可以使用IXMLNodeList.Delete()IXMLNodeList.Remove()方法来删除节点:

var 
    Root: IXMLNode; 
begin 
    Root := XMLDocument1.DocumentElement; 
    Root.ChildNodes.Delete('ElementData'); 
    for I := 0 to Root.ChildNodes.Count-1 do 
    Root.ChildNodes[I].ChildNodes.Delete('ElementData'); 
end; 

var 
    Root, Child, Node: IXMLNode; 
begin 
    Root := XMLDocument1.DocumentElement; 
    Node := Root.ChildNodes.FindNode('ElementData'); 
    if Node <> nil then Root.ChildNodes.Remove(Node); 
    for I := 0 to Root.ChildNodes.Count-1 do 
    begin 
    Child := Root.ChildNodes[I]; 
    Node := Child.ChildNodes.FindNode('ElementData'); 
    if Node <> nil then Child.ChildNodes.Remove(Node); 
    end; 
end; 

如果你想删除所有ElementData元素无论其深度的文档中,递归程序可以这样做:

procedure RemoveElementData(Node: IXMLNode); 
var 
    Root, Child: IXMLNode; 
begin 
    repeat until Node.ChildNodes.Delete('ElementData') = -1; 
    for I := 0 to Node.ChildNodes.Count-1 do 
    RemoveElementData(Node.ChildNodes[I]); 
    end; 
end; 

begin 
    RemoveElementData(XMLDocument1.DocumentElement); 
end; 
+0

删除节点后,我使用'IXMLDocument'的'SaveToFile'过程保存文档,但它为每个删除的节点写入一个空行。有关如何避免这种情况的任何想法? (我在Delphi 2007上测试) – ExDev

+0

@ExDev当原始文档在元素节点之间有空白文本节点(换行符等)时,例如在加载时启用'ParseOptions'属性中的'poPreserveWhiteSpace'标志该文档,然后在删除元素节点时不删除这些额外的文本节点。 –

+0

我从头开始创建一个新文档。为了便于阅读,我在文档的“选项”中添加了'doNodeAutoIndent'。然后,我使用'Remove'函数删除一个节点,做完这些之后,我应该怎么做才能删除空行? [示例](https://s2.postimg.org/pjt5l6jix/remove_node.png) – ExDev