Autor Beitrag
JustQt
Hält's aus hier
Beiträge: 11


D5
BeitragVerfasst: Mi 22.10.03 10:27 
Hi,

ich hab ein kleines Problem.

Ich habe ein Programm, das ein XML Dokument in ein anderes XML Dokument konvertiert.

Bei einem neuen ist das auch kein Problem, das funktioniert.
Allerdings soll die Erweiterung jetzt eine bestimmte Anzahl (UserEingabe) neuer XML Docs generieren. Dazu müßte ich allerdings mein neues IXMLDOMDocument zur Laufzeit erzeugen, z.B:
ausblenden Delphi-Quelltext
1:
2:
for i := 1 to UserEingabeAnzahl do
  generateNewXMLDocs (XMLDoc+i : IXMLDOMDocument );

=> XMLDoc1, XMLDoc2, XMLDoc3, etc...

oder so ähnlich. So funktioniert das natürlich nicht, weil ich meine IXMLDOMDocument Variable oben bei den vars angeben müßte. Das geht aber nunmal auch wieder nicht, weil ich nicht weiß, wieviele neue XMLDocs ich brauche.

Wäre für Hilfe sehr dankbar!

ciao,
Jennifer

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.10.03 11:24 
Vielleicht hilft dir ein dynamisches Array weiter:
ausblenden Delphi-Quelltext
1:
2:
var
  DOMDocs : array of DOMDocument40;

Das lässt sich zur Laufzeit vergrößern:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// einmalig beim Programmstart initialisieren
SetLength(DOMDocs,0);

// dann das 1. Dokument erzeugen
SetLength(DOMDocs,1);
DOMDocs[0] := CoDOMDocument40.Create;

Du solltest es beim Beenden nur wieder freigeben:
ausblenden Delphi-Quelltext
1:
SetLength(DOMDocs,0);					


btw: Ich weiß nicht, womit du arbeitest. Der Beispielaufruf zum Erzeugen stammt direkt aus der Typbibliothek des MS-XML-Parsers. Ggf. musst du das Erzeugen durch den von dir gewünschten Befehl ersetzen.
JustQt Threadstarter
Hält's aus hier
Beiträge: 11


D5
BeitragVerfasst: Mi 22.10.03 11:35 
Titel: ...
Hi,

ja, an ein Array hatte ich auch schon gedacht...

Ich arbeite mit der MSXML2_TLB.pas

mein Aufruf wäre dann idealerweise:

newXMLDoc[0] := IXMLDOMDocument.Create();

Allerdings gibt es keine Create() Funktion :?

ciao,
Jennifer
barfuesser
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 324



BeitragVerfasst: Mi 22.10.03 11:53 
Wie wärs mit TXMLDocument?

barfuesser
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.10.03 13:07 
Gibt´s nicht bei Delphi 5, @barfuesser.

@JustQt: Hast du schon mal mit dem XML-Parser von Microsoft gearbeitet? MSXML2_TLB wird die Unit grundsätzlich genannt, was aber verwirrend ist (IMHO). Darum habe ich 3 Units: MSXML2_TLB, MSXML3_TLB und MSXML4_TLB. Kann man erraten, welche Unit für welche XML-Version ist? ;) Egal. Mein Aufrufbeispiel galt speziell für XML 4, im Prinzip lässt du aber nur die Nummer weg:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// IXMLDOMDocument = DOMDocument
// (schau mal in die "*_TLB.pas" rein)

DOMDocs[0] := CoDOMDocument.Create;
if(DOMDocs[0] <> nilthen try
  // mach was damit
finally
  DOMDocs[0] := nil;
end;

Du könntest ja mal einen Blick in die XML-Tutorials werfen.
JustQt Threadstarter
Hält's aus hier
Beiträge: 11


D5
BeitragVerfasst: Do 23.10.03 11:41 
Titel: ...
Hi,

ja, ich habe diesen MS Parser MSXML2_TLB.

Also, jedenfalls, ich hab's jetzt etwas anders gelöst.
Ich lege mir ein neues xmldoc an:

myDoc := CoDOMDocument.Create;

dann schreib ich kram rein und speichere es unter

myDoc_1.xml
myDoc_2.xml
etc...

Also ich benutze quasi die gleiche Instanz, die ich vor meiner Schleife einmal erzeuge, nur speichere ich sie unter unterschiedlichen Namen. :roll: Hoffe das ist jetzt richtig ausgedrückt.

Jetzt habe ich nur das Problem, das er den Kram den er im ersten gespeicherten Doc hatte auch in die darauffolgenden schreibt, also quasi die neuen Knoten anhängt.

Habe auch schon versucht in jeder Schleife mein myDoc neu zu erzeugen, aber da zickt er rum, weil es ja im speicher noch existiert. :?

hab's schon mit
zähler := 0;

schleife begin
erzeugen
reinschreiben
speichern_zähler.xml
myDoc := nil;
inc(zähler);
schleife end;

*grob abgekürzt* :wink:

probiert um das doc irgendwie zu leeren, aber das will er nicht. Gibt's da irgendwas anderes, was ich machen kann, so in der Art??

Danke im Vorraus!
Jennifer
JustQt Threadstarter
Hält's aus hier
Beiträge: 11


D5
BeitragVerfasst: Do 23.10.03 13:46 
Titel: ...
:beer:

Es geht!!!

zähler := -1;
Schleife begin;
inc(zähler);
mydoc := CoDOMDocument.Create;
reinschreiben
speichern_zähler.xml
mydoc.loadXML(''); // löscht alles aus dem mydoc
Schleife end;

Yippiehhhh! :dunce: