我正在寻找一些实际的工作示例代码来使用普通的OmniXml(或OmniXmlUtils)单元读取XML。我不想使用TOmniXMLWriter类,如其他地方所述,但希望使用普通的Delphi代码加载xml文件。
我搜索了OmniXml网站,但那里的样本和不存在的样本一样好。
提前致谢。
答案 0 :(得分:4)
使用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 inside的目录,其中包含所有演示。他们会向你解释几乎所有事情。
如果您决定在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行)。无需检查节点是否存在等等。枚举器有很大帮助。我强烈建议你使用这种方法,因为它更清晰。
答案 1 :(得分:1)
来自示例链接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的作者应该将示例代码发布在他身边。
感谢。