【问题标题】:Using OmniXML implementation in Delphi 10 Seattle在 Delphi 10 Seattle 中使用 OmniXML 实现
【发布时间】:2016-03-08 15:36:57
【问题描述】:

我试图了解在我们将用 Delphi 10 Seatlle 编写的应用程序中使用 OmniXML。我已经搜索了互联网,但我能找到的只是示例,这些示例显然使用了另一个版本的 Delphi 和/或另一个版本的 OmniXML,因为它们使用的语句不再被接受

喜欢

 var doc: IXMLDocument;
 doc := CreateXMLDoc;
 doc.selectSingleNode(....);
 doc.SelectNodes(...);

我对使用带有命名空间的 Selectnodes() 尤其感兴趣(在 MSXML 实现中,必须设置“SelectionNamespaces”属性)。

任何人都可以向我提供或指向 Delphi 10 Seattle 中的 OmnniXML 工作示例吗?

【问题讨论】:

  • 这里很难克服所有的拼写错误。也很难相信 OmniXML 发生了如此大的变化,以至于所有历史示例都不再有效。 “不再接受nog”是什么意思?是否有一些实际代码和错误消息?如果您发布一个无法编译的完整程序(或者如果错误是运行时错误,则无法运行)并寻求帮助会更好。在这里询问示例是题外话:stackoverflow.com/help/on-topic.
  • 上面的代码无法编译,3 个语句中没有一个是有效的 ;-) 我发现的大多数示例的问题是没有指定使用条款,这使得几乎不可能重新创建像我这样的 xml 初学者,沉迷于 XMLDoc、XMLDOm、Omnixmldom、XMLintf 等
  • OmniXML 看起来无论如何都已经死了。你确定这是一个不错的选择吗?
  • OmniXML 接口在很长一段时间内都没有改变,因此您很可能只是在uses 子句中遗漏了一个单元。由于您未能发布显示您实际尝试执行的操作的 MCVE,因此无法确定。我在一些已更新到西雅图的遗留项目中使用 OmniXML,它们都运行良好。
  • @Bascy 作为一个独立的项目,OmniXML 似乎垂死了。我不知道它已被 Emba 吸收用于 x-plat 目的,但它很有意义。我认为关键在于您使用标准的 Emba XML RTL 库,但使用omnixml 作为 DOM 供应商。因此,您不想使用 OmniXML 示例。您想使用 XMLDoc 示例。另一种思考方式是,您没有使用 OmniXML,它只是后端,即供应商 DOM。

标签: xml delphi delphi-10-seattle


【解决方案1】:

好吧,我使用以下代码运行它。仍然让我想知道如何在 XPATH 搜索中使用命名空间,但我会就此发布另一个问题。

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  XML.XMLDom,
  XML.XMLDoc,
  XML.omnixmldom,
  XML.XMLIntf
  ;

const
  cXML = '<?xml version="1.0"?>' +
         '<catalog xmlns:xs12=''http://www.w3.org/2001/XMLSchema-instance''>' +
         '   <xs12:book id="bk101">' +
         '     <xs12:author>Gambardella, Matthew</xs12:author>' +
         '      <xs12:title>XML Developers Guide</xs12:title>' +
         '    <xs12:genre>Computer</xs12:genre>' +
         '    <xs12:price>44.95</xs12:price>' +
         '    <xs12:publish_date>2000-10-01</xs12:publish_date>' +
         '    <xs12:description>An in-depth look at creating applications with  XML.</xs12:description>' +
         '</xs12:book>'
          + '</catalog>'
         ;
var
  doc: IXMLDocument;
  list: IDOMNodeList;
  lSelectNode: IdomNodeSelect;
begin

  DefaultDOMVendor := sOmniXmlVendor;
  try
    try
      doc := LoadXMLData(cXML);

      doc.DocumentElement.DeclareNamespace('a', 'http://www.w3.org/2001/XMLSchema-instance');

      if supports(doc.DOMDocument, IDomNodeSelect, lSelectNode) then
      begin
        list := lSelectNode.selectNodes('a:book');
        Writeln(Format( '%d nodes', [List.length]));
      end;

    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
  end;
end.

【讨论】:

  • 缺少 lSelectNode 的类型定义以完全理解此示例
猜你喜欢
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多