Вы можете использовать функцию ChildNodes.Delete
для удаления узлов. В этом примере я использовал Omni XML в качестве поставщика (чтобы избежать инициализации COM):
program SO60488378;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Xml.XmlDom,
Xml.omnixmldom,
XMLDoc,
XMLIntf,
System.SysUtils;
var
XMLinput : String;
Doc : IXMLDocument;
begin
XMLinput := '<?xml version="1.0" encoding="UTF-8"?>'+#13#10+
'<?xml-stylesheet type="text/xsl" href="class.xsl"?>'+#13#10+
'<class>'+#13#10+
' <student>Jack</student>'+#13#10+
' <student>Harry</student>'+#13#10+
' <student>Rebecca</student>'+#13#10+
' <teacher>Mr. Bean</teacher>'+#13#10+
'</class>'+#13#10;
try
DefaultDOMVendor := sOmniXmlVendor;
Doc := NewXMLDocument();
Doc.LoadFromXML(XMLInput);
// delete second node from root
Doc.ChildNodes.Delete(1);
Writeln(FormatXMLData(Doc.XML.Text));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Вывод:
<?xml version="1.0"?>
<class>
<student>Jack</student>
<student>Harry</student>
<student>Rebecca</student>
<teacher>Mr. Bean</teacher>
</class>
Редактировать: Добавление решения как предложено @PeterWolf:
Doc.LoadFromXML(XMLInput);
// loop all root nodes and delete first xml-stylesheet node
// if you want to delete ALL stylesheet nodes, just inverse the loop and remove the break statement
for Index := 0 to Doc.ChildNodes.Count-1 do
begin
Node := Doc.ChildNodes[Index];
if (Node.NodeType = ntProcessingInstr) and (Node.NodeName = 'xml-stylesheet') then
begin
Doc.ChildNodes.Delete(Index);
Break;
end;
end;
Writeln(FormatXMLData(Doc.XML.Text));