Autor |
Beitrag |
lkz633
      
Beiträge: 136
WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
|
Verfasst: Mi 13.08.03 18:46
Hallo,
ich kann ohnen Probleme mit IXMLDocument eine XML-Datei einlesen und auf bestimmte Knoten zugreifen.
Jetzt versuche ich, selber XML Dateien zu erstellen, bekomme es aber beim besten Willen nicht hin. Habe schon alles versucht, addchild, createnode, createelement. es kommt nie eine Fehlermeldung, aber die XML Datei bleibt leer.
Koennte jemand einen Quellcode posten, der z.B folgende Struktur erzeugt:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| <Firma> <Mitarbeiter> <id>1</id> <Name>olaf</Name> <Ort>...</Ort> </Mitarbeiter> <Filiale> </Filiale> </Firma> |
Das waere sehr hilfreich fuer mich
MFG lkz633
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 09:41
Erst kürzlich in der DP beantwortet.  Wenn du den Parser von Microsoft benutzt, dann erstellst du zuerst ein neues Objekt:
Delphi-Quelltext 1: 2:
| xmldoc := CoDOMDocument.Create; |
und dann erstellst die gewünschte Struktur:
Delphi-Quelltext 1:
| xmldoc.loadXML('<Firma><Mitarbeiter><!-- usw. --></Mitarbeiter><Filiale/></Firma>'); |
Voilà, und du kannst darauf zugreifen. Das müsste IMHO auch mit anderen XML-Parsern ähnlich gehen.
|
|
lkz633 
      
Beiträge: 136
WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
|
Verfasst: Do 14.08.03 11:52
Hallo,
mit IXMLDocument geht es mit xml.add.
Aber es muss doch auch irgendwie mit createelement und addchild usw machbar sein oder? Ich braeuchte es so, da ich am Anfang noch nicht die ganze Struktur weiss und spaeter Knoten hinzufuegen moechte.
MFG lkz633
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 13:05
Tja, ich kann (leider) wieder nur für MS-XML sprechen, aber wenn du das XMLDocument benutzt, müsste dir doch eigentlich die Code-Vervollständigung von Delphi helfen?!
Sprich: Name des Objektes eintippen, Punkt ran und warten ... bis Delphi die Liste mit den Möglichkeiten bringt. Du könntest dann durch Tippen von c-r-e-a-t-e usw. fündig werden.
Oder du müsstest mal in der Doku von diesem IXMLDocument suchen.
|
|
lkz633 
      
Beiträge: 136
WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
|
Verfasst: Do 14.08.03 13:11
MathiasSimmack hat folgendes geschrieben: |
Sprich: Name des Objektes eintippen, Punkt ran und warten ... bis Delphi die Liste mit den Möglichkeiten bringt. Du könntest dann durch Tippen von c-r-e-a-t-e usw. fündig werden.
Oder du müsstest mal in der Doku von diesem IXMLDocument suchen. |
Das habe ich selbstverstaendlich getan, und deswegen z.B createelement auch benutzt, wie in der Hilfe beschrieben, doch die gespeicherte datei ist leer 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 13:40
Also: steig um auf den Parser von Microsoft.  Dazu kann ich dir wenigstens eine funktionierende Anleitung geben. 
|
|
Sasfatu
Hält's aus hier
Beiträge: 1
|
Verfasst: Fr 09.07.04 15:45
Natürlich geht das!
Ich bin zwar was Delphi angeht ziemlicher newbie, aber xml geht mit den
von Dir beschriebenen Funktionen (heißen halt ein bischen anders) auch
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure CreateXML var xmldoc : IXMLDOMDocument; root : IXMLDOMElement; elem : IXMLDOMElement; begin xmldoc := CoDOMDocument.Create; root := xmldoc.createElement('firma'); elem := xmldoc.createElement('mitarbeiter'); elem.setAttribute('name','olaf maier'); root.appendChild(elem); xmldoc.documentElement.appendChild(Root); xmldoc.save('d:\test.xml'); end; |
Du kannst Dir ja mal bei Microsoft die Hilfe anschauen. Da findest Du viel darüber
Leider bin ich ich mit Delphi noch nicht so vertraut. Ich bin immer noch
auf der Suche wie ich eine doctype dem xml Dokument anhängen kann.
Gruß
Sas
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 09.07.04 17:44
Bis nächsten Monat konntest du nicht warten, wie? Dann wär´s nämlich genau ein Jahr später gewesen.
Außerdem ist das Problem bei deinem Code, dass du konsequent alle Schutzmechanismen ignorierst. Die meisten Dinge sind Funktionen, bei denen man den Erfolg oder Misserfolg auf die ein oder andere Weise am Rückgabeergebnis ablesen kann.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Fr 09.07.04 19:04
wenn ich dazu mal was sagen darf;
Die korrekte Vorgehensweise wäre eine DTD oder Schema der XML Datei anzulegen.
Dann wird das XMLDocument geöffnet, das Schema/DTD geöffnet und eine Wrapperklasse generiert, die dann so ungefähr aussieht.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| IXMLPage = interface; TXMLPageFolders = class; TXMLFolder = class;
IXMLPage = interface(IXMLNode) ['{4966633E-A165-43BA-AEEF-86690C1625A6}'] function Get_Index: Integer; function Get_Config: IXMLConfig; function Get_LastUpdate: WideString; TXMLPageFolders = class(TXMLNodeCollection, IXMLPageFolders) protected function Get_Folder(Index: Integer): IXMLFolder; function Add: IXMLFolder; function Insert(const Index: Integer): IXMLFolder; public procedure AfterConstruction; override; end;
TXMLFolder = class(TXMLNode, IXMLFolder) protected function Get_FolderID: Integer; function Get_FolderName: WideString; function Get_FolderUrl: WideString; procedure Set_FolderID(Value: Integer); procedure Set_FolderName(Value: WideString); procedure Set_FolderUrl(Value: WideString); end;
u.s.w.
var MXML: IXMLPage; CXML: IXMLFolder; XML.Active:= true; XML.Version:='1.0'; XML.StandAlone:='yes'; XML.Encoding:='ISO-8859-1'; MXML:= GetPage(XML); ...
while not Clients.eof do begin CXML:= MXML.PageFolders.Add; CXML.FolderID:= ClientsPageID.Value; ...
und als joke sozusagen, noch ein stylesheet draufhauen function TWeb.ApplyXSL(XMLBody, XSLBody : string) : string; var XSL, XML : IXMLDOMDocument; begin try XSL:=CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument; XSL.async:=False; XSL.loadXML(XSLBody); XML:=CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument; XML.async:=False; XML.loadXML(XMLBody); Result:=XML.transformNode(XSL); except result:=''; end; end; |
alles klare???
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 09.07.04 19:49
Äh, aber wozu soll das alles gut sein? Hier ... in diesem speziellen Fall?, ... der ohnehin seit Monaten erledigt sein dürfte ... Wozu brauchst du hier einen Wrapper? Das ist doch nur sinnvoll, wenn du eine XML-Datei bspw. nach HTML transformieren willst. Für den Zugriff auf Knoten, das Erstellen von neuen Knoten, usw. ist ein Wrapper nicht erforderlich. Oder zumindest keiner, der so umfangreich (um das Wort "kompliziert" zu vermeiden) ist.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 10.07.04 19:19
lass uns den fall mal aufrollen
Mit Wrapper meine ich keine Datenkonvertierung, sondern das Teil was sich öffnet wenn man doppelt auf ein TXMLDocument klickelt. Dann Schema/XML/DTD öffnen das ganze rödeln lassen und raus kommen schöne Interfaces in einer neuen Unit.
(Dat war der obige Quelltext).
Ansonsten reicht auch ein (dat isch kompliziert) writeln (textfile,'xmlcode');
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 10.07.04 19:25
Aha, verstehe ...  ... Allerdings sagt mir das alles nichts, da ich mich doch auch in Zukunft mit Delphi 5 beschäftigen werde. Und da bleibt mir (will ich auf separate Komponenten verzichten) "nur" (in Anführungsstrichen, weil ich gern damit arbeite!) der MS-XML Parser.
Bei dem habe ich nur die eine Unit. Und ich hatte bisher keine Probleme damit. Okay, ich bin zwar auf eine installierte XML-Version von Microsoft angewiesen. Aber die Projekte, die das bisher nutzen, setzen das ohnehin voraus. Mein Help 2.0-Registrierungstool bspw.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 10.07.04 19:34
hat somit eher weniger mit dem Parser sondern mit deiner Delphi-Version zu tun. Gibts bei D5 kein TXMLDocument? Hab's zwar auch - allerdings nicht installiert (wie auch die vorversion 1-4 und BP 7.0).
Das ganze nennt sich übrigens Datenanbindungs-Experte. Hat den Vorteil, du musst nicht alles über "nodes" organisieren sondern hast normale "Variablen" entsprechend dem XML-Dokument. Ist etwas besser lesbar.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Sa 10.07.04 23:09
Moin!
Nein, bis Delphi 5 gibt es das TXMLDocument nicht mit bei. Man kann es aus der ActiveX Komponente selber nachinstallieren. Da ich mit D5 hauptsächlich entwickle und auch mal XML brauchte und nicht den grossen Klotz von MS wollte, habe ich mir selber eine kleine XML Unit geschrieben die für meine Zwecke reichte. Ist sonst auf meiner HP zu finden, samt Delphi Hilfe Datei und Doku.
MfG
Muetze1
|
|