У любого есть пример кода для загрузки XML с использованием OMNIXML - PullRequest
2 голосов
/ 29 августа 2010

Я ищу какой-то действующий пример кода для чтения XML с использованием простого модуля OmniXml (или OmniXmlUtils).Я не хочу использовать класс TOmniXMLWriter, как объяснено в другом месте, но хочу загрузить XML-файл, используя простой код Delphi.

Я искал сайт OmniXml, но примеры там такие же, как и несуществующие.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 29 августа 2010

Некоторые распространенные операции с OmniXML:

Загрузка документа из файла, из потока или строки

xml := CreateXMLDoc
xml.Load(FileName);
xml.LoadFromStream(XMLAsStream);
xml.LoadXML(XMLAsString)

Выбор одного узла (5-й дочерний элемент):

MyNode := XML.ChildNodes.Item[4];
MyNode := XML.SelectSingleNode('Node[5]');

Выбор с помощью XPath

MyNode := XML.SelectSingleNode('/MyNodes/SpecificNodes/Node[5]');

Выбор набора узлов

MyNodes := XML.SelectNodes('/MyNodes/SpecificNodes/Node');

Если вы загрузили с http://www.omnixml.com/download.html, то внутри находится каталог с именем demo, содержащий вседемос.Они объяснят вам практически все.

Если вы решите использовать SimpleStorage поверх OmniXML, позвольте мне показать вам, как будет выглядеть ваш верхний пример с помощью 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

НетВы видите, сколько стандартного кода пропало (21 строка кода сокращена до 7 для той же функциональности).Нет необходимости проверять, существует ли узел и т. Д., И перечислители очень помогают.Я настоятельно рекомендую вам использовать этот подход, потому что он намного понятнее.

1 голос
/ 29 августа 2010

Из примера ссылки Keeper ответил. Это была часть SelectNodes ('..') и SelectSingleNode ('...'), которую я искал:

xml := CreateXMLDoc;
if not xml.Load(rssFileName) then
   ListBox1.Items.Add('Not an XML document: '+rssFileName)
else begin
 channels := xml.DocumentElement.SelectNodes('channel');
 for iChannel := 0 to channels.Length-1 do begin
   channel := channels.Item[iChannel];
   title := channel.SelectSingleNode('title');
   if assigned(title) then
     ListBox1.Items.Add('['+title.Text+']')
   else
     ListBox1.Items.Add('[]');
   items := channel.SelectNodes('item');
   for iItem := 0 to items.Length-1 do begin
     title := items.Item[iItem].SelectSingleNode('title');
     if assigned(title) then
       ListBox1.Items.Add('  <'+title.Text+'>')
     else
       ListBox1.Items.Add('  <>');
   end; //for iItem
 end; //for iChannel

конец;

Это было воскресенье, и я хотел спросить решение, прежде чем углубляться в исходный код Omni :)

Я думаю, что автор OmniXml должен опубликовать такие вещи, как пример кода на своей стороне.

Спасибо.

...