Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
453 Beiträge
 
#8

AW: XML Knoten holen

  Alt 3. Aug 2023, 16: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 15:06 Uhr) Grund: Beschreibung der mORMot Funktionen hinzugefügt
  Mit Zitat antworten Zitat