Some common taks with OmniXML:
Loading the document from file or from stream or string
xml := CreateXMLDoc
xml.Load(FileName);
xml.LoadFromStream(XMLAsStream);
xml.LoadXML(XMLAsString)
Selecting a single node (5th child):
MyNode := XML.ChildNodes.Item[4];
MyNode := XML.SelectSingleNode('Node[5]');
Selecting with XPath
MyNode := XML.SelectSingleNode('/MyNodes/SpecificNodes/Node[5]');
Selecting collection of nodes
MyNodes := XML.SelectNodes('/MyNodes/SpecificNodes/Node');
If you downloaded from http://www.omnixml.com/download.html then there is a directory called demo inside, that contains all the demos. They will explain almost everything to you.
If you decide to use SimpleStorage on top of OmniXML, let me show you how your upper example would look, using SimpleStorage.
xml := StorageFromFile(rssFileName)
for channel in xml.Elements('channel') do
begin
ListBox1.Items.Add('['+channel.Get('title')AsStringDef+']')
for Item in channel.Elements('item') do
ListBox1.Items.Add(' <'+ Item .Get('title')AsStringDef+'>')
end; //for iChannel
No do you see how much boilerplate code was gone (21 lines of code shrunk to 7 for the same functionality). There is no need to check if the node exists etc.. and enumerators help greatly. I strongly suggest you use this approach because it is so much clearer.