代码之家  ›  专栏  ›  技术社区  ›  Edelcom

任何人都有使用OMNIXML加载xml的示例代码

  •  2
  • Edelcom  · 技术社区  · 15 年前

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

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

    提前谢谢。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Runner    15 年前

    OmniXML的一些常见tak:

    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行)。不需要检查节点是否存在等。。而普查员也帮了大忙。我强烈建议你使用这种方法,因为它更清晰。

        2
  •  1
  •   Edelcom    15 年前

    从样本链接管理员回答。 我要找的是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的作者应该把这些东西作为示例代码放在自己的一边。