XML Config auslesen , ohne Item Nummern.

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

XML Config auslesen , ohne Item Nummern.

Beitrag von Mathias »

Hier eine XML Beispiel mit Count und Nummerierung:

Code: Alles auswählen

      <Example Count="3">
        <Item0 Caption="Blank" SourceFile="SourceBlank" />
        <Item1 Caption="Default" SourceFile="SourceAVRDefault" />
        <Item2 Caption="Blink Pin 133" SourceFile="SourceAVRATmega328Blink_Pin_13" />
      </Example>
Welches einfach mit der Unit Laz2_XMLCfg ausgelesen werden kann.

Hier als Beispiel ein Auschnitt aus einer *.lpi, welche keine Nummerierung hat.

Code: Alles auswählen

    <Exceptions>
      <Item>
        <Name Value="EAbort"/>
      </Item>
      <Item>
        <Name Value="ECodetoolError"/>
      </Item>
      <Item>
        <Name Value="EFOpenError"/>
      </Item>
    </Exceptions>
Geht dies auch irgendwie mit der Unit Laz2_XMLCfg ?
Oder muss ich mich da zwingend mit dem DOMNode etc. aus der Unit laz2_DOM rumschlagen ?
Zuletzt geändert von Mathias am So 27. Mär 2022, 10:01, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von theo »

Was willst du denn machen?
Die Attribute auslesen ist jetzt kein Hexenwerk.

Code: Alles auswählen

uses ... Laz2_DOM, laz2_XMLRead;         

procedure TForm1.Button1Click(Sender: TObject);
var
  ExceptionsNode: TDOMNode;
  Doc: TXMLDocument;
  i: integer;
begin
  try
    ReadXMLFile(Doc, 'test.xml');
    ExceptionsNode := Doc.DocumentElement.FindNode('Exceptions');
    for i := 0 to ExceptionsNode.ChildNodes.Count - 1 do
      ShowMessage(ExceptionsNode.ChildNodes[i].FirstChild.Attributes.GetNamedItem('Value').NodeValue);
  finally
    Doc.Free;
  end;
end;  
Wobei test.xml:

Code: Alles auswählen

<CONFIG>
 <Exceptions>
  <Item>
   <Name Value="EAbort" />
  </Item>
  <Item>
   <Name Value="ECodetoolError" />
  </Item>
  <Item>
   <Name Value="EFOpenError" />
  </Item>
 </Exceptions>
</CONFIG>

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von martin_frb »

Code: Alles auswählen

XmlConf.GetValue('Exceptions/Item[0]', default);
XmlConf.GetValue('Exceptions/Item[1]', default);
XmlConf.GetValue('Exceptions/Item[2]', default);

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von Mathias »

martin_frb hat geschrieben:
Di 29. Mär 2022, 10:30

Code: Alles auswählen

XmlConf.GetValue('Exceptions/Item[0]', default);
XmlConf.GetValue('Exceptions/Item[1]', default);
XmlConf.GetValue('Exceptions/Item[2]', default);
Ich habe dies gerade ausprobiert, funktioniert aber nicht. Es kommt nur ein Ausnahmefehler.

Code: Alles auswählen

  s := 'Board/Item0/Example/Item[0]/SourceFile';
  WriteLn(s);
  WriteLn(' ' + Cfg.GetValue(s, 'abc')); 
Dies funktioniert, wie erwartet.

Code: Alles auswählen

  s := 'Board/Item0/Example/Item/SourceFile';
  WriteLn(s);
  WriteLn(' ' + Cfg.GetValue(s, 'abc'));   
Meine XML in abgespeckter Form:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
  <Board Count="1">
    <Item0 Caption="Arduino UNO" Arch="avr" SubArch="AVR5" Controller="atmega328p">
      <Example Count="3">
        <Item Caption="Blank" SourceFile="SourceBlank" />
        <Item Caption="Default" SourceFile="SourceAVRDefault" />
        <Item Caption="Blink Pin 133" SourceFile="SourceAVRATmega328Blink_Pin_13" />
      </Example>
      <Programmer Value="avrdude" />
      <avrdude Controller="atmega328p" Programmer="arduino" COM_Port="/dev/ttyACM0" Baud="115200" Disable_Auto_Erase="False" Chip_Erase="False" />
    </Item0>
  </Board>
</CONFIG>
So wie es aussieht, muss ich es mit Theos Variante machen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von Socke »

Es gibt ja noch den Zwischenweg:

Code: Alles auswählen

var i: Ingeger;
  s: String;
begin
  for i := 0 to high(i) do
  begin
    s := Format('Board/Item%d/Example/Item/SourceFile', [i]);
    WriteLn(s);
    WriteLn(' ' + Cfg.GetValue(s, 'abc'));
    if (* Abbruchbedingung *) then break;
  end;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von Mathias »

Socke hat geschrieben:
Mi 30. Mär 2022, 07:30
Es gibt ja noch den Zwischenweg:

Code: Alles auswählen

var i: Ingeger;
  s: String;
begin
  for i := 0 to high(i) do
  begin
    s := Format('Board/Item%d/Example/Item/SourceFile', [i]);
    WriteLn(s);
    WriteLn(' ' + Cfg.GetValue(s, 'abc'));
    if (* Abbruchbedingung *) then break;
  end;
end;
Mein Ziel ist es von der Nummerierung der Item weg zu kommen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von theo »

Das Bsp. von martin_frb geht beinahe. Anhand meines Beispiel-XML oben funktioniert es so:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var XmlConf:TXMLConfig;
begin
  XmlConf:=TXMLConfig.Create('test.xml');
  Memo1.Lines.Add(XmlConf.GetValue('Exceptions/Item[1]/Name/Value', 'null'));
  Memo1.Lines.Add(XmlConf.GetValue('Exceptions/Item[2]/Name/Value', 'null'));
  Memo1.Lines.Add(XmlConf.GetValue('Exceptions/Item[3]/Name/Value', 'null'));
  XmlConf.free;
end;      
Aus irgendwelchen Gründen beginnt der Index also nicht bei 0 sondern bei 1.
Ich wüsste aber nicht, wie man so die Anzahl der "Items" herausbekommt, falls das eine Rolle spielt.

EDIT: Doch, auch das geht mit GetChildCount.

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var XmlConf:TXMLConfig;
  i:integer;
begin
  XmlConf:=TXMLConfig.Create('test.xml');
  for i:=1 to XmlConf.GetChildCount('Exceptions') do
    Memo1.Lines.Add(XmlConf.GetValue('Exceptions/Item['+inttostr(i)+']/Name/Value', 'null'));
  XmlConf.free;
end;  
Ob das jetzt wesentlich einfacher ist, als der Weg ohne Laz2_XMLCfg, darüber kann man wohl streiten.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: XML Config auslesen , ohne Item Nummern.

Beitrag von Mathias »

Jetzt habe ich die perfekte Lösung:

Code: Alles auswählen

  for i := 1 to Cfg.GetChildCount('Boards') do begin
    WriteLn(Cfg.GetValue('Boards/Board[' + i.ToString + ']/Caption', 'x'));
  end;
Danke an alle, die auf die Sprünge geholfen haben.

Der umgekehrte Weg geht auch:

Code: Alles auswählen

  for i := 5 to 10 do begin
    Cfg.SetValue('tests/test[' + i.ToString + ']/value', i);
  end;
Ausgabe:
Wen man nicht bei "1" beginnt, fügt er automatisch Leer-Items ein.

Code: Alles auswählen

  <tests>
    <test/>
    <test/>
    <test/>
    <test/>
    <test value="5"/>
    <test value="6"/>
    <test value="7"/>
    <test value="8"/>
    <test value="9"/>
    <test value="10"/>
  </tests>
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten