Hali!
Talán tudok segíteni, épp egy XML-lel kommunikáló programon dologzok.
Viszont nem világos a kérdésed: az mit takar, hogy az <invoice></invoice> eltávolítása után jó? Az a root node, miért kell eltávolítani? Azért, mert csak a <invoiceitems> "látszik" onnan, azon belül nem? Az nem baj, a root alatt az a szint van, tovább kell menned a struktárán.
Annyit kell csinálnod, hogy bejárod a teljes struktúrát, és úgy keresed meg amit szeretnél. Ez a legegyszerűbben egy rekurzív függvénnyel oldható meg. Az általad említett oldalon a "Fastruktúra feltöltése XML-lel" találsz ilyen példát, benne a szükséges rekurzív függvénnyel. Azzal meg tudsz keresni konkrét node-ot (akár egy ág legvégén is).
De így is csinálhatod, ha egy egyszerű indulás kell:
var
Node: TDOMNode = nil;
Child: TDOMNode = nil;
Item: TDOMNode = nil;
begin
Node := XMLDocument.DocumentElement.FindNode('invoiceitems');
for Child in Node do
for Item in Child do
writeln(Item.NodeName + ': ' + Item.TextContent);
end;
Így a Node az "invoiceitems" struktúrára mutat (lehet a root alatt más node is, azt is megkeresheted így). Fontos, hogy a FindNode csak az adott node gyerekei között keres azokon belül nem.
Utána a Child az "invoiceitem" lesz, sorra az összes (for..in..do).
Ezen belül az Item az "item1", "item2", stb. lesz, amennyi van.
Így csak a létezőket járod végig, ezen a konkrét struktúrán.
Ezt már át tudod alakítani másmilyenre, vagy legalább ötletet ad az induláshoz.
Ha jól tévedek, akkor a ReadXMLFile (ha azzal olvasod be az XML-t) kihagyja az üres node-okat, így az "item2" elmarad már beolvasás közben.