Delphi-PRAXiS

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)

Christian18 3. Sep 2007 21:16


XML auslesen
 
Hallo,

ich habe eine XMl Datei, die folgendermaßen aussieht.

XML-Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<app>Prgname</app>
</note>
Wie kann ich nun Prgname auslesen?

Delphi-Quellcode:
function GetPrgName() : String;
begin
  // Was müsste hier rein?
end;

MFG Christian18

BenjaminH 3. Sep 2007 21:26

Re: XML auslesen
 
Welche Delphi Version hast du denn?
Bei Turbo Delphi gibt's unter Datei->Neu->Weitere unter Delphi-Projekte->XML die XML-Datenbindung, die aus einem XML-Dokument automatisch ein Interface generiert.

Christian18 3. Sep 2007 21:30

Re: XML auslesen
 
Hallo,

ich verwende Delphi 7 Prof.

LG Chris

marabu 3. Sep 2007 21:31

Re: XML auslesen
 
... oder du schaust dir diesen Thread an: klick

Gute Nacht

Christian18 7. Sep 2007 20:02

Re: XML auslesen
 
Hallo,

ich bins mal wieder. Wie kann man Attribute eines Knoten auslesen?

Lg Chris

Muetze1 7. Sep 2007 21:45

Re: XML auslesen
 
Was nutzt du denn zum auslesen? MSXML? ThaXML? OpenXML?

Christian18 7. Sep 2007 21:50

Re: XML auslesen
 
Hallo,

noch gar nicht, weil ich nicht weiß wie ich das machen soll. Ich habe echt keine ahnung wie ich das XML Dokument auslesen soll.

Hat du ein Beispiel??? Ich weiß nur, dass ich es über die XML Komponente von delphi machen soll.


LG Chris

Christian18 7. Sep 2007 21:57

Re: XML auslesen
 
Hallo,

hier nochmal mein Code, den ich bis jetzt habe.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var Xml : TXMLDocument;
      XmlFile : String;
begin
  Xml:=TXMLDocument.Create(self);
  try
    XmlFile:='c:\XmlFile.xml';
    if FileExists(XmlFile) then
      begin
        Xml.FileName:=XmlFile;
        Xml.Active:=True;
      end
    else
      begin
        MessageDlg('Die XmlFile konnte nicht gefunden werden.', mtError, [mbOK], 0);
      end;
  finally
    Xml.Free;
  end;
end;
Und hier mein XmlFile:

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>
Diese XmlFile müsste ich irgendwie auslesen und in einem Record speichern. Könnt ihr mir ein paar Tips geben?


LG Chris

WordsBG 7. Sep 2007 22:04

Re: XML auslesen
 
Hab mich letztens erst selbst um sowas kümmern müssen und ich kann nur sagen ich finde SimpleXML am besten.

XML-Code:
<xml version="1.0" encoding="ISO-8859-1"?>
<note>
<app>Prgname</app>
</note>
Das wäre dann etwa so zu lösen:

Delphi-Quellcode:
uses [...], SimpleXML;
[...]

function ReadXML(S: String): String;
var
  Doc: IXMLDocument;
  Element: IXMLNode;
begin
  Doc := CreateXmlDocument;
  Doc.Load(S);
  Element := Doc.DocumentElement.SelectSingleNode('app');
  Result := Element.Text;
end;

Christian18 7. Sep 2007 22:07

Re: XML auslesen
 
ich solles aber leider über die Delphi Komponente machen!!!

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 08:20 Uhr.

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