从Delphi中的IXMLDOMDOCUMENT中删除空的<ul>节点

时间:2015-05-14 08:58:42

标签: xml delphi delphi-2007

我在xmldocument中有很多xml节点。我想删除所有空<ul>个节点。我怎么能做到这一点?

这是一个片段:

  <li>
    <a href="javascript:void(0);">Level 1</a>
    <ul id="subject19">
      <li>
        <a href="javascript:void(0);">Level 2</a>
        <ul id="subject20">
          <li>
            <a href="javascript:void(0);">Level 3</a>
            <ul id="subject21"/>
          </li>
        </ul>
      </li>
    </ul>
  </li>

我需要删除<ul id="subject21"/>

1 个答案:

答案 0 :(得分:2)

您可以使用简单的递归。以下是一个示例:

procedure ScanAndRemove(aNode: IXMLNode);
var
  i: Integer;
  childNode: IXMLNode;
begin
  i := 0;
  while i < aNode.ChildNodes.Count do
  begin
    childNode := aNode.ChildNodes[i];
    if (childNode.NodeName = 'ul') and (childNode.ChildNodes.Count = 0) then
      aNode.ChildNodes.Remove(childNode) else
      begin
        ScanAndRemove(childNode);
        Inc(i);
      end;
  end;
end;

然后传递文档根元素:

procedure Cleanup;
var
  xmlDoc: IXMLDocument;
begin
  xmlDoc := TXMLDocument.Create(nil);
  try
    xmlDoc.LoadFromXML('...');
    ScanAndRemove(xmlDoc.DocumentElement);
    // now xmlDoc contains the desired result
  finally
    xmlDoc := nil;
  end;
end;

修改 递归函数删除没有子节点但包含值的节点。例如:

<ul>
  blabla
</ul>

如果你想要相反,你应该再添加一个检查 - 即:

if (childNode.NodeName = 'ul') and 
  (childNode.ChildNodes.Count = 0) and 
  (VarToStrDef(childNode.NodeValue, '') = '') then
  ... 

或者这样 - https://stackoverflow.com/a/9673869/3962893