【发布时间】:2010-08-29 08:04:34
【问题描述】:
我正在寻找一些实际的工作示例代码来使用普通的 OmniXml(或 OmniXmlUtils)单元读取 XML。我不想使用 TOmniXMLWriter 类,如其他地方解释的那样,但想使用纯 Delphi 代码加载 xml 文件。
我搜索了 OmniXml 网站,但那里的示例与不存在一样好。
提前致谢。
【问题讨论】:
我正在寻找一些实际的工作示例代码来使用普通的 OmniXml(或 OmniXmlUtils)单元读取 XML。我不想使用 TOmniXMLWriter 类,如其他地方解释的那样,但想使用纯 Delphi 代码加载 xml 文件。
我搜索了 OmniXml 网站,但那里的示例与不存在一样好。
提前致谢。
【问题讨论】:
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 的目录,其中包含所有演示。他们会向您解释几乎所有内容。
如果您决定在 OmniXML 之上使用 SimpleStorage,让我向您展示使用 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 行以实现相同的功能)。无需检查节点是否存在等。枚举器有很大帮助。我强烈建议您使用这种方法,因为它更清晰。
【讨论】:
从示例链接 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的作者应该把示例代码之类的东西贴在他身边。
谢谢。
【讨论】: