【问题标题】:Anyone has sample code to load an xml using OMNIXML任何人都有使用 OMNIXML 加载 xml 的示例代码
【发布时间】:2010-08-29 08:04:34
【问题描述】:

我正在寻找一些实际的工作示例代码来使用普通的 OmniXml(或 OmniXmlUtils)单元读取 XML。我不想使用 TOmniXMLWriter 类,如其他地方解释的那样,但想使用纯 Delphi 代码加载 xml 文件。

我搜索了 OmniXml 网站,但那里的示例与不存在一样好。

提前致谢。

【问题讨论】:

    标签: xml delphi delphi-7


    【解决方案1】:

    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 行以实现相同的功能)。无需检查节点是否存在等。枚举器有很大帮助。我强烈建议您使用这种方法,因为它更清晰。

    【讨论】:

    • 感谢代码 - 相信我,我确实搜索了 OmniXML 的演示文件夹,但没有“SelectSingleNode” - 这正是我正在寻找的。我将研究 SimpleStorage,尽管我的代码现在正在运行。再次感谢,真的很感激。
    【解决方案2】:

    从示例链接 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的作者应该把示例代码之类的东西贴在他身边。

    谢谢。

    【讨论】:

    • 看看“cromis.net/blog/downloads/simplestorage”上的 SimpleStorage,因为它是 OmniXML 之上的接口集合,大大简化了 XML 操作。你正在做的事情需要更少的代码,并且更容易编写和理解。
    • 如果您下载代码,OmniXML 也有示例。它们显示了您需要了解的几乎所有内容。
    • @Runner 我想我有最新版本 .. 请给我展示如何加载 xml 的示例,找到一些特定的节点等等......我没有找到任何。跨度>
    最近更新 更多