Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML auslesen (https://www.delphipraxis.net/98896-xml-auslesen.html)

Mackhack 7. Sep 2007 23:13

Re: XML auslesen
 
Hm,

definiere mal bitte Delphi Komponente :-)

Christian18 7. Sep 2007 23:14

Re: XML auslesen
 
Wie soll ich diese Definieren??? Die ist bei Delphi standart dabei. Also ab Version 7 glaube ich

marabu 8. Sep 2007 08:04

Re: XML auslesen
 
Hallo Christian,

du benutzt bestimmt TXMLDocument aus der Palettenseite "Internet".

Dein XML-Dokument ist nicht optimal aufgebaut, aber ich nehme an, dass es vorgegeben ist.
Die Item-Elemente sind nicht geschlossen, wohl ein Fehler beim abtippen?

Hier mein Ansatz unter Verwendung deines korrigierten XML-Dokument:

Delphi-Quellcode:
procedure SetProperty(comp: TComponent; const propName: string; value: Variant);
var
  ppi: TypInfo.PPropInfo;
begin
  ppi := GetPropInfo(comp, propName);
  if Assigned(ppi) then
    SetPropValue(comp, propName, value);
end;

procedure Localize(comp: TComponent; doc: IXMLDocument);
var
  i: Integer;
  attr, elem, group: IXMLNode;
  groupName: string;
begin
  groupName := Copy(comp.ClassName, 2, Maxint);
  group := doc.DocumentElement.ChildNodes[groupName];
  if Assigned(group) then
  begin
    elem := group.ChildNodes[comp.Name];
    if Assigned(elem) then
      for i := 0 to Pred(elem.AttributeNodes.Count) do
      begin
        attr := elem.AttributeNodes[i];
        SetProperty(comp, attr.NodeName, attr.NodeValue);
      end;
  end;
end;

procedure TDemoForm.FormCreate(Sender: TObject);
var
  doc: IXMLDocument;
  nl: IXMLNode;
  i: Integer;
begin
  doc := LoadXMLData(Memo.Text);
  doc.Active := True;

  Localize(Button1, doc);
  // ...
end;
Besser wäre die Abbildung der Container-Hierarchie des Formulars, denn durch Gruppierung nach Klassen kannst du mit deinem XML-Dokument nur eindeutige Komponentennamen auflösen. Wäre die Abbildung vorhanden, dann könnte man Localize() zu einer rekursiven Funktion umgestalten und die ganze Form mit einem Aufruf lokalisieren.

Grüße vom marabu

Christian18 8. Sep 2007 10:28

Re: XML auslesen
 
Hallo,

nein die XmlFile habe ich selber gemacht. Da sind mir keine Grenzen gesetzt. Wie kann ich es denn Optimal aufbauen?

XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
  <Language>
    <Button>
      <Button1 Caption="Neu" Tag="1" />
      <Button2 Caption="Bearbeiten" Tag="2" />
      <Button3 Caption="Löschen" Tag="3" />
      <Button4 Caption="Beenden" Tag="4" />
    </Button>

    <DBGrid>
      <Item1 Caption="Kunden - ID" Tag="1">
      <Item2 Caption="Vorname" Tag="2">
      <Item3 Caption="Name" Tag="3">
    </DBGrid>
  </Language>

marabu 8. Sep 2007 10:52

Re: XML auslesen
 
Einen Ansatz habe ich dir ja schon genannt:

Zitat:

... Besser wäre die Abbildung der Container-Hierarchie des Formulars, denn durch Gruppierung nach Klassen kannst du mit deinem XML-Dokument nur eindeutige Komponentennamen auflösen. ...
Ein Beispiel:

Code:
<Localization lang="DE">
    <MainForm>
        <TopPanel>
            <NewButton Caption="&amp;Neu"/>
            <DeleteButton Caption="&amp;Löschen"/>
        </TopPanel>
    </MainForm>
    <NewDialog>
       
    </NewDialog>
</Localization>
Bei meinem Beispiel gehe ich davon aus, dass es für jede Sprache ein eigenes XML-Dokument gibt.

Ein weiterer Ansatz wäre: Du schaust mal wie das existierende Lösungen machen und kupferst dort ein wenig ab.

Freundliche Grüße

Christian18 9. Sep 2007 10:11

Re: XML auslesen
 
Hallo,

irgendwie ist das alles noch nicht sowas wie ich suche. Die Funktion habe ich ja schon vorgegeben. Ich komme an der Stelle ja nicht weiter. Eure Funktion ist vieleicht schön. Aber sowas suche ich nicht. Ich habe versucht es in meiner zu übertragen aber klappt nicht. Was mache ich falsch?

Delphi-Quellcode:
  var Xml   : TXMLDocument;
      Lang  : IXMLNode;
      Main  : IXMLNode;
      Labels : IXMLNodeList;
begin
  Xml:=TXMLDocument.Create(nil);
  Xml.LoadFromFile('D:\Lang\Deu.lng');
  Xml.Active:=True;

  Lang:=Xml.DocumentElement['Language'];
  Main:=Lang.ChildNodes['UMain'];
  Labels:=Lang.AttributeNodes['Label'];
Ich will das Attribut bei Caption einfach nur in einer String Variablen speichern.

<?xml version="1.0" encoding="ISO-8859-1"?>

<Language Lang="Deutsch">
<UMain>
<Label Caption="Neu" Tag="1" />
</UMain>
</Language>

marabu 9. Sep 2007 12:22

Re: XML auslesen
 
Zitat:

Zitat von Christian18
... Ich will das Attribut bei Caption einfach nur in einer String Variablen speichern.

das ist nicht so schwer:

Delphi-Quellcode:
begin
  // ...
  ShowMessage(Xml.DocumentElement
    .ChildNodes['UMain']
    .ChildNodes['Label']
    .AttributeNodes['Caption'].NodeValue
  );
  // ...
end;

Christian18 9. Sep 2007 15:32

Re: XML auslesen
 
Zitat:

Zitat von marabu
Zitat:

Zitat von Christian18
... Ich will das Attribut bei Caption einfach nur in einer String Variablen speichern.

das ist nicht so schwer:

Delphi-Quellcode:
begin
  // ...
  ShowMessage(Xml.DocumentElement
    .ChildNodes['UMain']
    .ChildNodes['Label']
    .AttributeNodes['Caption'].NodeValue
  );
  // ...
end;

Hallo,

da kommt aber immer eine Fehlermeldung!!! Ungültige Zeigeroperation!
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var xml : TXMLDocument;
begin
  xml:=TXMLDocument.Create(nil);
  xml.LoadFromFile('D:\Project\Lang\Deu.lng');
  xml.Active:=True;

  ShowMessage(Xml.DocumentElement.ChildNodes['UMain'].ChildNodes['Label'].AttributeNodes['Caption'].NodeValue);
end;

marabu 9. Sep 2007 16:18

Re: XML auslesen
 
Die Fehlermeldung rührt nicht von meiner Code-Zeile her. Sie sollte verschwinden, wenn du Application oder self als Owner an TXMLDocument.Create() übergibst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.
Seite 2 von 2     12   

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