2013-07-12 109 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文件的實際路徑和名稱。另外,「它不適合我」不是對問題的描述;我無法從這裏閱讀你的屏幕或你的想法,所以我不知道這意味着什麼。 –