XML-Datei mit laz2_DOM etc. auslesen und kürzen

Rund um die LCL und andere Komponenten
Antworten
Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

XML-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von Cybermonkey342 »

Hallo zusammen,

ich habe mal die Frage an die XML-Experten, ob es grundsätzlich möglich ist, einzelne Nodes komplett zu löschen. Hintergrund ist, dass eine andere Software eine XML-Datei erstellt und dabei Duplikate fabriziert. Somit kann die Datei durchaus über 30.000 Zeilen umfassen. Alle Duplikate müssen dann per Hand gelöscht werden. Das wäre nicht weiter schlimm, doch sind die auch durcheinander, womit man nicht einfach runderscrollen und löschen kann.
Die Datei sieht Ausschnittsweise so aus:

Code: Alles auswählen

<Formular>
		<UserName>BestellungNeu</UserName>
		<RefFormular>Drucker</RefFormular>
		<Active>0000000001</Active>
		<ChangeTarget>Nein</ChangeTarget>
		<IndexPerm>0000003011</IndexPerm><TempIndex>0000003011</TempIndex>
</Formular>
<Formular>
		<UserName>BestellungAlt</UserName>
		<RefFormular>Drucker</RefFormular>
		<Active>0000000001</Active>
		<ChangeTarget>Nein</ChangeTarget>
		<IndexPerm>0000003012</IndexPerm><TempIndex>0000003012</TempIndex>
</Formular>
<Formular>
		<UserName>BestellungNeu</UserName>
		<RefFormular>Drucker</RefFormular>
		<Active>0000000001</Active>
		<ChangeTarget>Nein</ChangeTarget>
		<IndexPerm>0000003013</IndexPerm><TempIndex>0000003013</TempIndex>
</Formular>
Ich möchte nun also erreichen, dass mein Programm erkennt, dass das Formular "BestellungNeu" z.B. 247x vorhanden ist und 246x aus der Datei gelöscht werden kann, aber nicht "BestellungAlt". Reichen mir dazu die laz2_DOM und laz2_XMLRead/Write etc. Units aus?
Mit besten Grüßen,
Cybermonkey

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: XML-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von Winni »

Hallo!

Ich hasse ja das XML-Zeugs.

Wenn es nicht zu kompliziert ist, dann baue ich einen Mini-Parser für den jeweiligen Zweck.
Mach ich mit dem SEPA-Zeug genauso.

Hier ist eine kleine Stringlist-Anwendung für Dich.

1 mal "BestellungNeu" bleibt erhalten, der Rest wird gelöscht.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const xml = './test.xml';
var sl : TstringList;
    start,stop,i,k : integer;
    count: Integer = 0;
begin
sl := TStringList.Create;
sl.loadFromFile(xml);
for i := sl.Count - 1 downto 0 do
   begin
   if pos ('</Formular>',sl[i]) > 0 then stop := i;
   if pos ('<Formular>',sl[i]) > 0 then
      begin
        start := i;
        if pos ('BestellungNeu',sl[i+1]) > 0 then
          begin
          inc(Count);
          if count > 1 then
             begin
             for k := stop downto start do sl.delete (k);
             end; // > 1
          end; // BestellungNeu
        end; // begin Formular
   end; //for

showMessage ('BestellungNeu: '+IntToStr(count));
sl.saveToFile('./test_neu.xml');
sl.free;
end;
Den bzw. die Dateinamen musst Du natürlich anpassen.

Winni

Cybermonkey342
Beiträge: 109
Registriert: Sa 1. Mär 2008, 15:19
OS, Lazarus, FPC: openSUSE Leap 15.6 (FPC 3.2.2) / Windows 11 Pro (FPC 3.2.2)
CPU-Target: x64
Kontaktdaten:

Re: XML-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von Cybermonkey342 »

Danke dafür, das schaue ich mir mal an. Ich hatte auch schon an einen eigenen Parser gedacht. Allerdings möchte ich dem Anwender die Möglichkeit geben, dass er die zu löschendenen Formulare z.B. in einer TListview vorher auswählen kann. Aber ich denke, damit komme ich schon weiter.
Mit besten Grüßen,
Cybermonkey

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: XML-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von BeniBela »

In XQuery kann man sowas in einer Zeile machen, von jedem Namen das erste Vorkommen kopieren:

Code: Alles auswählen

for $formular in doc("/tmp/test.xml")/*/Formular group by $username := $formular/UserName return $formular[1]		
Mit meinen Internet tools kann man das in fpc ausführen:

Code: Alles auswählen

writeln(query('<output>{for $formular in doc($_1)/*/Formular group by $username := $formular/UserName return $formular[1]}</output> ', ['/tmp/test.xml']).toNode.outerXML());

reiter
Beiträge: 217
Registriert: Sa 18. Nov 2017, 16:58

Re: XML-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von reiter »

Dein link geht aber ins leere bei github

Gruß
Reiter

Socke
Lazarusforum e. V.
Beiträge: 3178
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-Datei mit laz2_DOM etc. auslesen und kürzen

Beitrag von Socke »

MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten