Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中读取XML文件?_Xml_Delphi_Delphi Xe3 - Fatal编程技术网

如何在Delphi中读取XML文件?

如何在Delphi中读取XML文件?,xml,delphi,delphi-xe3,Xml,Delphi,Delphi Xe3,这是我想做的事情。 我的程序在以下方面运行良好: 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.

这是我想做的事情。 我的程序在以下方面运行良好:

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;
XMLText=''+
'' +
《哈利波特》+
“J.K.罗琳。”+
'400' +
'';
程序TForm1.按钮1单击(发送方:TObject);
变量
XMLDoc:IXMLDOMDocument;
Node,SibNode:IXMLDOMNode;
开始
备忘录1.清晰;
XMLDoc:=CoDOMDocument.Create;
loadXML(XMLText);
结束;
现在,我想从project所在的同一文件夹中导入包含6000本书(books.XML)的XML文件,而不是constXMLText。我该怎么做


谢谢!:)

选项1:直接从磁盘加载

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

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

或者,您可以先将文件加载到字符串中。在这种情况下,我几乎找不到任何理由这样做,但知道这一点也无妨


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

选项1:直接从磁盘加载

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

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

或者,您可以先将文件加载到字符串中。在这种情况下,我几乎找不到任何理由这样做,但知道这一点也无妨

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

为此使用Delphi

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

这些包装器基于
IXMLDOMDocument
,它与您现在使用的
IXMLDOMDocument
非常相似,并在其周围添加一层,使您能够通过Delphi编译器提供的更多支持访问数据,这通常使处理XML内部数据的过程比使用普通的
IXMLDocument
IXMLDOMDocument
容易得多

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

使用此向导时存在一个和一个问题。

为此使用Delphi

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

这些包装器基于
IXMLDOMDocument
,它与您现在使用的
IXMLDOMDocument
非常相似,并在其周围添加一层,使您能够通过Delphi编译器提供的更多支持访问数据,这通常使处理XML内部数据的过程比使用普通的
IXMLDocument
IXMLDOMDocument
容易得多

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


使用此向导时有a和a。

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


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


这不是问题所问的做什么。这个问题是关于使用
IXMLDOMDocument
并从文件而不是常量字符串加载的。XML数据绑定向导并不是关于XML和Delphi的所有问题的答案。我知道,而且当您从一个小XML字符串扩展到一个可能涉及更多逻辑的大XML文件时,我仍然认为它是一个有效的答案。我见过普通的
IXMLDOMDocument
解决方案在太多客户机上失败,通常添加一个中间层会使过程更加容易。让我知道你认为我可以在哪里把我的答案说得更清楚,我会努力做到这一点。注意:我对您的答案投了赞成票,因为这是最简单的解决方案。我同意XML数据绑定向导的局限性。使用当前的编译器技术(泛型、属性),可以生成更好的包装器。我还没有上传我的大部分XML演示,这可能构成一个更详细答案的基础(:+1.编辑得很好;如果链接目标由于某种原因没有建立起来,这些信息会更有用。我将删除我最后的评论,因为你已经解决了大部分问题(尽管关于不回答问题的部分仍然适用):-)这不是问题所要做的。问题是关于使用
IXMLDOMDocument
并从文件而不是常量字符串加载。XML数据绑定向导并不是关于XML和Delphi的所有问题的答案。我知道,而且当您从一个小XML字符串扩展到一个大XML字符串时,我仍然认为这是一个有效的答案可能涉及更多逻辑的文件。我看到过太多客户端的纯
IXMLDOMDocument
解决方案失败,通常添加一个中间层会使过程更容易。请告诉我您认为我可以在哪里使我的答案更清楚,我将尝试这样做。请注意,我对您的答案投了赞成票,因为这是最简单的解决方案。我同意使用当前的编译器技术(泛型、属性)可以生成一个更好的包装器。我还没有上传我的大部分XML演示,这可能是一个更详细的答案(:+1.Nic)的基础
procedure TForm1.Button1Click(Sender: TObject);
var
  XMLDoc: IXMLDOMDocument;
begin
  XMLDoc := CoDOMDocument.Create;
  XMLDoc.load('MyBooks.xml');
  Memo1.Lines.Text := XMLDoc.xml;
end;