2013-07-12 112 views
1

这是我想要做的事情。 我的计划是工作的罚款与此:如何在Delphi中读取XML文件?

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; 

现在我想导入XML文件同一文件夹6000种书刊(Books.xml的),其中项目,而不是常量XMLTEXT。我怎样才能做到这一点?

谢谢! :)

回答

5

选项1:直接从磁盘

IXMLDomDocument负载具有load方法接受的文件名。您可以使用该方法而不是您当前使用的loadXML

选项2:将文件加载到一个字符串第一

或者,你可以先的文件加载到一个字符串。在这种情况下,我几乎找不到任何理由这样做,但它永远不会受到伤害。 :)

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

3

为此,请使用Delphi XML Data Binding Wizard

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

这些包装都是基于IXMLDocument这是非常相似的IXMLDOMDocument你现在使用,并添加它周围的一层,让您更多的支持来自Delphi编译器访问您的数据通常使得处理过程XML内的数据比使用普通的IXMLDocumentIXMLDOMDocument容易得多。

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

有一个good tutorialnice video使用此向导。

+0

这不是什么问题问这样做。这个问题是关于使用'IXMLDOMDocument'和从文件加载而不是一个常量字符串。 XML数据绑定向导不是每个关于XML和Delphi的问题的答案。 –

+0

我知道,我认为这是一个有效的答案,当你从一个小的XML字符串扩展到一个可能涉及更多逻辑的大型XML文件时。我已经看到普通的'IXMLDOMDocument'解决方案在太多客户端失败,并且通常添加一个中间层使得该过程变得更容易。让我知道你认为我可以让我的答案更清楚,我会尽力做到这一点。注意我赞成你的答案,因为它是最简单的解决方案。 –

+0

我同意XML数据绑定向导的限制。使用当前的编译器技术(泛型,属性)可以生成更好的包装器。我仍然没有上传大部分XML演示,这可能构成更详细答案的基础(: –

3

只要改变loadXMLload('YourFileName.xml')

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

它对我不起作用。 Xml文件需要与.exe文件位于同一文件夹中,是否正确? – user2572823

+0

不,它不适用于我.. – user2572823

+3

当然,将“MyBooks.xml”替换为您自己的XML文件的实际路径和名称。另外,“它不适合我”不是对问题的描述;我无法从这里阅读你的屏幕或你的想法,所以我不知道这意味着什么。 –