【问题标题】:How to read XML file in Delphi?如何在 Delphi 中读取 XML 文件?
【发布时间】:2013-07-12 12:05:25
【问题描述】:

这是我想做的事情。 我的程序运行良好:

XMLText =  '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
'<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
  '<title>Harry Potter</title>' +
  '<author>J. K. Rowling.</author>' +
  '<length>400</length>' +
'</book>';


procedure TForm1.Button1Click(Sender: TObject);
var
XMLDoc: IXMLDOMDocument;
Node, SibNode: IXMLDOMNode;
begin
  Memo1.Clear;
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.loadXML(XMLText);
end;

现在我想从项目所在的同一文件夹中导入包含 6000 本书 (books.xml) 的 XML 文件,而不是 const XMLText。我该怎么做?

谢谢! :)

【问题讨论】:

    标签: xml delphi delphi-xe3


    【解决方案1】:

    选项 1:直接从磁盘加载

    IXMLDomDocument 有一个接受文件名的load 方法。您可以使用该方法代替您当前使用的loadXML

    选项2:首先将文件加载到字符串中

    或者,您可以先将文件加载到字符串中。在这种情况下,我几乎找不到任何理由这样做,但知道它永远不会有害。 :)

    看看TStringStream,它有一个LoadFromFile 方法从磁盘加载文件。您可以使用它将整个books.xml 加载到内存中。加载文件后,您可以将字符串流的DataString 属性传递给loadXML 方法。此属性将流的全部内容(包含 XML)作为字符串返回。

    【讨论】:

      【解决方案2】:

      为此使用 Delphi XML Data Binding Wizard

      它将在您的 XML 文件周围生成一个带有 Delphi 包装对象的单元(或者如果您有一个描述 XML 的 XSD 文件)。

      这些包装器基于IXMLDocument,它与您现在使用的IXMLDOMDocument 非常相似,并在其周围添加一个层,使您可以在Delphi 编译器的更多支持下访问您的数据通常使该过程处理 XML 中的数据比使用普通的 IXMLDocumentIXMLDOMDocument 容易得多。

      该单元包含从文件或字符串加载 XML 的方法。

      有一个good tutorial 和一个nice video 使用这个向导。

      【讨论】:

      • 这不是问题所要求的。该问题询问有关使用IXMLDOMDocument 并从文件而不是常量字符串加载。 XML 数据绑定向导并不是所有有关 XML 和 Delphi 问题的答案。
      • 我知道,当您从一个小的 XML 字符串扩展到可能涉及更多逻辑的大 XML 文件时,我仍然认为这是一个有效的答案。我已经看到普通的IXMLDOMDocument 解决方案在太多的客户端上失败了,通常添加一个中间层会使这个过程变得更容易。让我知道您认为我可以在哪里使我的答案更清楚,我会尽力做到这一点。注意我赞成你的答案,因为它是最简单的解决方案。
      • 我同意 XML 数据绑定向导的限制。使用当前的编译器技术(泛型、属性)可以生成更好的包装器。我还没有上传我的大部分 XML 演示,这可以构成更详细的答案的基础(:
      • +1。不错的编辑;如果链接目标由于某种原因未启动,则该信息会更加有用。我将删除我的最后一条评论,因为您已经解决了它所说的大部分内容(尽管关于不回答问题的部分仍然适用)。 :-)
      【解决方案3】:

      只需将loadXML 更改为load('YourFileName.xml')

      procedure TForm1.Button1Click(Sender: TObject);
      var
        XMLDoc: IXMLDOMDocument;
      begin
        XMLDoc := CoDOMDocument.Create;
        XMLDoc.load('MyBooks.xml');
        Memo1.Lines.Text := XMLDoc.xml;
      end;
      

      【讨论】:

      • 它对我不起作用。 xml 文件需要与 .exe 文件在同一个文件夹中,对吗?
      • 当然,将“MyBooks.xml”替换为您自己的 XML 文件的实际路径和名称。此外,“它对我不起作用”不是对问题的描述;我无法从这里读取你的屏幕或你的想法,所以我不知道这意味着什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多