Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML-Header auslesen bei IXMLDOMDocument (https://www.delphipraxis.net/104923-xml-header-auslesen-bei-ixmldomdocument.html)

Martin K 12. Dez 2007 21:17


XML-Header auslesen bei IXMLDOMDocument
 
Hallo,

habe mich erstmals mit XML in Delphi beschäftigt und mich dabei hauptsächlich an das Tutorial von CalganX gehalten.
Eine Frage habe ich jedoch noch, wenn ich eine XML-Datei per load() lade:
Wie komme ich an die Header-Zeile, also z.B. diese hier:
XML-Code:
<?xml version="1.0" encoding="UTF-8"?>
...
Gibt es hier eine extra Funktion, wie ich diese Attribute auslesen kann (Version, Encoding, etc.)?
Ich nutze IXMLDOMDocument3.

Noch was anderes, was mir aufgefallen ist (hoffe, das ist jetzt nicht zu sehr OT):
Muss man hier das erstellte IXMLDOMDocument nicht irgendwie wieder freigeben?
Funktioniert dies über die Funktion _Release() ?

Danke schonmal für eure Antworten :xmas:

Martin K 13. Dez 2007 23:58

Re: XML-Header auslesen bei IXMLDOMDocument
 
* PUSH *

Neuromancer 17. Dez 2007 13:25

Re: XML-Header auslesen bei IXMLDOMDocument
 
Hallo,

der XML-Header ist bei einem wohlgeformten XML-Dokument immer der erste Knoten in einem Dokument - zumindest habe ich es noch nie anders gesehen.

Zugriff bekommst du also über
Delphi-Quellcode:
myXMLDocument.childNodes[0];
Die Attribute liest du über
Delphi-Quellcode:
myXMLDocument.childNodes[0].attributes.getNamedItem( 'version' );
myXMLDocument.childNodes[0].attributes.getNamedItem( 'encoding' );
...
usw.
...
aus.


Gruß

Neuromancer 17. Dez 2007 13:37

Re: XML-Header auslesen bei IXMLDOMDocument
 
Zitat:

Zitat von Martin K
Muss man hier das erstellte IXMLDOMDocument nicht irgendwie wieder freigeben?

Nein, das funktioniert über die COM Garbage Collection. IXMLDOMDocument ist ein Interface.

Zitat:

Funktioniert dies über die Funktion _Release() ?
Wenn du das Objekt explizit freigeben willst (beispielsweise um zu verhindern, dass du innerhalb derselben Prozedur nochmals auf das Objekt zugreifen kannst), dann setze es manuell auf nil.

Gruß

Bernhard Geyer 17. Dez 2007 13:40

Re: XML-Header auslesen bei IXMLDOMDocument
 
Zitat:

Zitat von Neuromancer
Zitat:

Zitat von Martin K
Muss man hier das erstellte IXMLDOMDocument nicht irgendwie wieder freigeben?

Nein, das funktioniert über die COM Garbage Collection. IXMLDOMDocument ist ein Interface.

COM hat keine Gargabe Collection. Das ist die automatische Referenzzählung von Delphi. Deshalb kann man
1, Diese auch unabsichtlich überwinden (und sich über Abstürze wundern)
2, Fehler in Referenzzählung von verwendeten COM-Objekten beheben (z.B. um den IE halbwegs erträglich zu gestalten)

Martin K 17. Dez 2007 22:06

Re: XML-Header auslesen bei IXMLDOMDocument
 
Danke für eure Antworten.

Da ich über
Delphi-Quellcode:
myXMLDocument.documentElement
auf den Root-Knoten (und dessen Kinder-Knoten) zugegriffen habe, wusste ich nicht, dass das auch über die childNodes des IXMLDOMDocuments geht. Danke für den Hinweis!

Also ich verstehe noch nicht so ganz, mit:
Delphi-Quellcode:
myXMLDocument := CoDOMDocument60.Create;
erzeuge ich doch ein Objekt, dass auf dem Interface basiert.
Warum muss ich dieses Objekt nicht wieder freigeben? Es belegt doch schließlich auch Speicher?

Bernhard Geyer 17. Dez 2007 22:25

Re: XML-Header auslesen bei IXMLDOMDocument
 
Zitat:

Zitat von Martin K
Also ich verstehe noch nicht so ganz, mit:
Delphi-Quellcode:
myXMLDocument := CoDOMDocument60.Create;
erzeuge ich doch ein Objekt, dass auf dem Interface basiert.
Warum muss ich dieses Objekt nicht wieder freigeben? Es belegt doch schließlich auch Speicher?

Das macht Delphi automatisch für dich. Bei jedem Zuweisen eines Interfacezeiges wird AddRef aufgerufen, bei jeder "nillen" eines Interfacezeigers wird die Release-Methode aufgerufen. Ist nun der Referenzzähler auf 0, so wird das Objekt freigegeben. Ist nicht so "smart" wie ein wirklicher Garbage Collector aber in 99,9% der Fälle ohne Problem zu verwenden.

Martin K 18. Dez 2007 13:23

Re: XML-Header auslesen bei IXMLDOMDocument
 
Okay, danke für deine Antwort ;)

sakura 18. Dez 2007 15:26

Re: XML-Header auslesen bei IXMLDOMDocument
 
Zitat:

Zitat von Martin K
Okay, danke für deine Antwort ;)

IXMLDOMDocument* ist von IXMLDOMNode abgeleitet und unterstützt damit auch alle Methoden/Eigenschaften von IXMLDOMNode ;)

...:cat:...

Martin K 18. Dez 2007 22:54

Re: XML-Header auslesen bei IXMLDOMDocument
 
So, nun habe ich aber etwas festgestellt, wo ich mir keinen Reim drauf machen kann:
Delphi-Quellcode:
// Header des geladenen XML-Dokuments:
<?xml version="1.0" encoding="UTF-8"?>


var
  xml: IXMLDOMDocument3;

...

for i := 0 to xml.childNodes[0].attributes.length - 1 do
  // klappt, ich bekomme 'version' und 'encoding' nacheinander angezeigt
  ShowMessage(xml.childNodes[0].attributes[i].nodeName);

// hier bekomme ich nur das hier angezeigt:
// <?xml version="1.0"?>
ShowMessage(xml.childNodes[0].xml);

// klappt dagegen ohne Probleme, auch mit allen Attributen:
ShowMessage(xml.childNodes[1].xml);
Kann mir das einer erklären?
Warum wird mir bei xml.childNodes[0].xml nur das erste Attribut angezeigt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz