AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML Knoten holen

Ein Thema von creehawk · begonnen am 2. Aug 2023 · letzter Beitrag vom 3. Aug 2023
Antwort Antwort
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
243 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: XML Knoten holen

  Alt 3. Aug 2023, 10:34
So geht's..... als MischMasch aus XML und Strings.

Delphi-Quellcode:
begin
  ChainTexts := TStringlist.Create;
  ResultStrings := TStringlist.Create;
  ChainList := CoDOMDocument.create;
  ChainList.Load(ORGPath + 'ProductionChain.xml');
  ChainRoot := ChainList.DocumentElement;
  ChainUnits := ChainRoot.childNodes; // 128 Einträge
  BuildingShortList := CoDOMDocument.create;
  BuildingShortList.Load(XMLPath + 'BuildingsShort.xml');
  BuildingShortRoot := BuildingShortList.DocumentElement;
  BuildingShortNodes := BuildingShortRoot.childNodes; // 207 Einträge
  for I := 0 to BuildingShortNodes.Length-1 do
   begin
   GUID := BuildingShortNodes.item[I].attributes[0].text;
   for II := 0 to Chainunits.length-1 do
     begin
      ChainTexts := TStringlist.Create;
      ChainGUID := ChainUnits.item[II].SelectSingleNode('Values/Standard/GUID').text;
      ChainTexts.Add(ChainUnits.item[II].XML);
      for III:= 0 to ChainTexts.Count -1 do
        begin
          if AnsiPos(GUID, ChainTexts.Strings[III]) > 0 then ResultStrings.Add(ChainGUID + '#' + GUID)
        end;
     end;
  end;
  ResultStrings.SaveToFile(TMPPath + 'ChainGUIDs.txt');
end;
Aber schön ist anders.

creehawk
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#2

AW: XML Knoten holen

  Alt 3. Aug 2023, 11:57
Pos, AnsiPos oder sowas "unverständliches"

Delphi-Referenz durchsuchenSameStr (OK, das ist ein =), Delphi-Referenz durchsuchenSameText, Delphi-Referenz durchsuchenStartsStr, StartsText, Delphi-Referenz durchsuchenContainsStr, ContainsText uvm.

Warum überhaupt Pos?
Also warum ein Contains?
Wenn du nach 12345 suchts und dann auch 01234567 findets.


Wie in den Beispielen in #2 zu sehen, kann man im XPath auch Parameter, Parents, Childs, Siblings usw. prüfen. (darüber, darunter, daneben und sonstwo)
Auch kann man absolut, relativ oder komplett frei suchen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
479 Beiträge
 
#3

AW: XML Knoten holen

  Alt 3. Aug 2023, 15:44
So geht's..... als MischMasch aus XML und Strings.
Hast du die Wahl des Datenformats? JSON lässt sich einfacher verarbeiten. Wenn die Struktur nicht kompliziert ist, dann kannst du das XML auch einfach parsen:
Delphi-Quellcode:
function FindBuildingGUID(pmXMLStream: TStream; const pmcSearchBuilding: String): String; overload;
begin
  Result := '';
  if pmXMLStream = Nil then Exit; //=>
  if pmcSearchBuilding = 'then Exit; //=>

  var xmlSize: Int64 := pmXMLStream.Size;
  if (xmlSize > 0) and (xmlSize < High(NativeInt)) then
  begin
    var parser: TParser := TParser.Create(pmXMLStream);
    try
      var runGUID: String;
      while parser.SourcePos < xmlSize do
      begin
        if parser.Token = '<then
        begin
          parser.NextToken;
          if parser.Token = '/then
          begin
            repeat
              parser.NextToken;
            until parser.Token = '>';
          end
          else if parser.TokenSymbolIs('GUID') then
          begin
            parser.NextToken; // '>' closing tag
            parser.NextToken; // XML tag value
            runGUID := parser.TokenString;
          end
          else if parser.TokenSymbolIs('BUILDING') then
          begin
            parser.NextToken; // '>' closing tag
            parser.NextToken; // XML tag value
            if SameText(parser.TokenString, pmcSearchBuilding) then
              Exit(runGUID); //=>
          end;
        end;

        parser.NextToken;
      end;
    finally
      parser.Free;
    end;
  end;
end;

function FindBuildingGUID(const pmcXMLData, pmcSearchBuilding: String): String; overload;
begin
  Result := '';
  if pmcXMLData = 'then Exit; //=>
  if pmcSearchBuilding = 'then Exit; //=>

  var stream: TStringStream := TStringStream.Create(pmcXMLData);
  try
    Result := FindBuildingGUID(stream, pmcSearchBuilding);
  finally
    stream.Free;
  end;
end;

// Functions AnyTextFileToString, MakePath are from mORMot library.
// Required Units: mormot.core.text, mormot.core.unicode, mormot.core.os
begin
  var xml: String := AnyTextFileToString(MakePath([Executable.ProgramFilePath, 'daten.xml']));
  ShowMessage(Format('GUID: %s', [FindBuildingGUID(xml, '134614')]));
Lösung ohne Gewähr. Die Funktion AnyTextFileToString beachtet das Format und konvertiert, wenn es notwendig ist. MakePath verkettet zu einem Pfad unter Berücksichtigung des OS. TExecutable ist eine Datenstruktur (Record) mit nützlichen Variablen zur sofortigen Verwendung.

Bis bald...
Thomas

Geändert von mytbo ( 4. Aug 2023 um 14:06 Uhr) Grund: Beschreibung der mORMot Funktionen hinzugefügt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 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