我在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"/>
答案 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
...