【问题标题】:Remove specific XML element in Delphi在 Delphi 中删除特定的 XML 元素
【发布时间】:2015-06-13 13:39:33
【问题描述】:

我有一个 xml 文档,如下所示:

<?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 元素?

【问题讨论】:

  • 你为什么使用 XML 库?
  • 他可能正在使用默认的 TXMLDocument 包装器。
  • 是的,我正在使用 TXMLDocument。
  • ExtensionData 是一个元素,而不是一个属性,在这个例子中它也没有自己的属性。正确使用术语很重要,因为元素和属性的访问方式不同。

标签: xml delphi delphi-7


【解决方案1】:

您可以使用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;

【讨论】:

  • 删除节点后,我使用IXMLDocumentSaveToFile 过程保存文档,但它为每个删除的节点写入一个空行。关于如何避免这种情况的任何想法? (我在 Delphi 2007 上进行测试)
  • @ExDev 当原始文档在元素节点之间有空白文本节点(换行符等)时发生,例如在加载文档时启用ParseOptions 属性中的poPreserveWhiteSpace 标志,然后在删除元素节点时不要删除那些额外的文本节点。
  • 我正在从头开始创建一个新文档。出于可读性原因,我已将doNodeAutoIndent 添加到文档的Options。然后我正在使用Remove 函数删除一个节点,这样做之后,我应该怎么做才能删除空行? example
  • @ExDev 缩进是使用文本节点完成的。就像我说的,只需删除您要删除的元素节点之前/之后的额外文本节点。它们是同一个父节点的子节点。
  • 你说得对,我删除了多余的文本节点,空行消失了。我永远不会想到缩进是通过添加“假”节点来完成的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2020-08-03
相关资源
最近更新 更多