2013-07-12 1 views
1

Вот что я хочу сделать. Моя программа работает нормально с этим:Как читать XML-файл в Delphi?

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 объекта streamstreams методу loadXML. Это свойство возвращает все содержимое потока (содержащего XML) в виде строки.

3

Для этого используйте Delphi XML Data Binding Wizard.

Он сгенерирует единицу с объектами оболочки Delphi вокруг вашего XML-файла (или если у вас есть файл XSD, описывающий XML).

Эти упаковщики основаны на IXMLDocument, который очень похож на IXMLDOMDocument вы используете сейчас, и добавить слой вокруг него, что позволяет получить доступ к данным с дополнительной поддержкой от компилятора Delphi обычно делает процесс обработки данных внутри XML намного проще, чем использование простой IXMLDocument или IXMLDOMDocument.

Устройство содержит методы загрузки XML из файла или строки.

При использовании этого мастера есть good tutorial и nice video.

+0

Это не то, что вопрос, который задают о выполнении. Вопрос задавался об использовании 'IXMLDOMDocument' и загрузке из файла вместо постоянной строки. Мастер привязки данных XML не является ответом на каждый вопрос о XML и Delphi. –

+0

Я знаю, и я все еще думаю, что это правильный ответ, когда вы расширяетесь от маленькой строки XML до большого XML-файла, где задействована скорее логика. Я видел, как простые решения «IXMLDOMDocument» терпят неудачу у слишком большого числа клиентов, и, как правило, добавление промежуточного слоя упростило процесс. Дайте мне знать, где вы думаете, я могу сделать свой ответ более ясным, и я постараюсь сделать это. Примечание. Я оставил ваш ответ, поскольку это самое простое решение. –

+0

Я согласен с ограничениями мастера привязки данных XML. С текущей технологией компилятора (generics, attributes) можно создать гораздо лучшую оболочку.Я до сих пор не загрузил большинство своих XML-демонстраций, которые могли бы стать основой более сложного ответа (: –

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; 
+0

Это не работает для меня. Файл Xml должен находиться в той же папке, что и .exe-файл, правильно? – user2572823

+0

Нет, это не работает для меня .. – user2572823

+3

Замените «MyBooks.xml» на фактический путь и имя вашего собственного XML-файла, конечно. Кроме того, «это не работает для меня» не является описанием проблемы; Я не могу читать ваш экран или ваш ум отсюда, поэтому я понятия не имею, что это значит. –