Autor Beitrag
lkz633
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 136

WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
BeitragVerfasst: 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:

ausblenden 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



BeitragVerfasst: Do 14.08.03 09:41 
Erst kürzlich in der DP beantwortet. :wink: Wenn du den Parser von Microsoft benutzt, dann erstellst du zuerst ein neues Objekt:
ausblenden Delphi-Quelltext
1:
2:
xmldoc := CoDOMDocument.Create;
{ ... }

und dann erstellst die gewünschte Struktur:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 136

WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 136

WinXP, Suse Linux 8.2 (unter VMWare)
D7 Prof, K3 Prof
BeitragVerfasst: 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



BeitragVerfasst: Do 14.08.03 13:40 
Also: steig um auf den Parser von Microsoft. :mrgreen: Dazu kann ich dir wenigstens eine funktionierende Anleitung geben. :wink:
Sasfatu
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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
ausblenden 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');        // neues Element erstellen <- in dem Fall Root element
     elem := xmldoc.createElement('mitarbeiter');  // neues Element erstellen
     elem.setAttribute('name','olaf maier');       // ein Attribut an das Element hängen 
     root.appendChild(elem);                       // Element in RootElement hängen 
     xmldoc.documentElement.appendChild(Root);     // RootElement in Document hängen
    
     xmldoc.save('d:\test.xml');                   // und speichern fertig !!!

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 user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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. :mrgreen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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.
ausblenden volle Höhe Delphi-Quelltext
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}']
    { Zugriff auf Eigenschaften }
    function Get_Index: Integer;
    function Get_Config: IXMLConfig;
    function Get_LastUpdate: WideString;
// gekürzt
  TXMLPageFolders = class(TXMLNodeCollection, IXMLPageFolders)
  protected
    { IXMLPageFolders }
    function Get_Folder(Index: Integer): IXMLFolder;
    function Add: IXMLFolder;
    function Insert(const Index: Integer): IXMLFolder;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLFolder }

  TXMLFolder = class(TXMLNode, IXMLFolder)
  protected
    { IXMLFolder }
    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); // Getpage wird vom Wrapper erzeugt, gibt den 1.Knoten zurück
...

    while not Clients.eof do begin// DB abfrage
      CXML:= MXML.PageFolders.Add;  // hin unterknoten hinzufügen
      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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: 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