Topic: XML parser

в версии 4.6 есть XML, JSON parser или использовать  TStringList ?

Re: XML parser

Есть, могу дать пример из одного своего проекта, импорт в базу из JSON файла

procedure ImportJSON(JsonFile: string; idCity: integer);
var                                                               
  sl: TStringList;
  JSONObject, JSONObjProp, JSONObjGeometry: TJSONObject;

  i:integer;
  k: integer;
  JsonArray, JsonArrayCoord: TJSONArray;
  JSONString: TJSONString;

  sqlInsert, s: string;
begin
    SQLExecute('DELETE FROM ptp WHERE id_city='+IntToStr(idCity));
    JSONObject := nil;
    sl:=TStringList.Create;
    SQLExecute('PRAGMA synchronous = OFF');
    try
        sl.LoadFromFile(JsonFile);
        //пробуем распарсить
        JSONObject:=TJSONObject(TJSONObject.ParseJSONValue(sl.Text));
        if JSONObject <> nil then //парсинг прошел успешно - считываем названия пар
        begin

          frmDict.lbImport.Caption := '';
          frmDict.lbImport.Visible := true;

          JsonArray:=TJSONArray(JSONObject.GetPairByName('features').JsonValue);
          for i := 0 to JsonArray.Size-1 do
          begin
              sqlInsert := '';
              JSONObjProp := TJSONObject( TJSONObject(JsonArray.Get(i)).GetPairByName('properties').JsonValue );

              JSONString := TJSONString(JSONObjProp.GetPairByName('DateTime').JsonValue);
              s := JSONString.Value;
              s := ReplaceStr(s, 'T', ' ');
              s := ReplaceStr(s, 'Z', '');
              if Length(s)>=19 then sqlInsert := '"'+s+'"' else sqlInsert := 'NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('ptptype').JsonValue);
              s := JSONString.Value;
              if s = 'pedestrian' then sqlInsert := sqlInsert + ', 1'
              else if s = 'car' then sqlInsert := sqlInsert + ', 2'
              else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('carRedSignal').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('carTurnLeft').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('carTurnRight').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('pedRedSignal').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('pedWrongCross').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('pedKid').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';

              JSONString := TJSONString(JSONObjProp.GetPairByName('danger').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ' + s else sqlInsert := sqlInsert + ', NULL';


              JSONString := TJSONString(JSONObjProp.GetPairByName('description').JsonValue);
              s := JSONString.Value;
              if s <> '' then sqlInsert := sqlInsert + ', ''' + escape_special_characters(s)+'''' else sqlInsert := sqlInsert + ', NULL';

              JSONObjGeometry := TJSONObject( TJSONObject(JsonArray.Get(i)).GetPairByName('geometry').JsonValue );
              JsonArrayCoord := TJSONArray(JSONObjGeometry.GetPairByName('coordinates').JsonValue);

              if JsonArrayCoord.Size=2 then
              begin
                  sqlInsert := sqlInsert +', '+ JsonArrayCoord.Get(0).ToString;
                  sqlInsert := sqlInsert +', '+ JsonArrayCoord.Get(1).ToString;
              end;



              JSONObjGeometry := TJSONObject( TJSONObject(JsonArray.Get(i)).GetPairByName('geometry').JsonValue );
              JsonArrayCoord := TJSONArray(JSONObjGeometry.GetPairByName('coordinates').JsonValue);

              frmDict.lbImport.Caption := IntToStr(i)+ ' of ' + IntToStr(JsonArray.Size-1);
              Application.ProcessMessages;

              SQLExecute('INSERT INTO ptp (id_city, "datetime", id_ptptype, carRedSignal, carTurnLeft, carTurnRight, pedRedSignal, pedWrongCross, pedKid, danger, description, longitude, latitude) VALUES ('+IntToStr(idCity)+', '+sqlInsert+')');
          end;
          ShowMessage('Готово');
          frmDict.lbImport.Visible := False;

        end else
        begin
            //парсинг провалился - выводим сообщение
            ShowMessage('error');
        end;

    finally
        sl.Free;
        SQLExecute('PRAGMA synchronous = FULL');
    end;
end;


пример JSON файла

{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "DateTime": "2015-01-15T08:00:00.000Z", "ptptype": "car", "carRedSignal": "0", "carTurnLeft": "0", "carTurnRight": "0", "pedRedSignal": "0", "pedWrongCross": "0", "pedKid": "0", "danger": "0", "description": "На 15.01. т.г., около 08:00 часа, в гр. Варна, на кръстовището на ул. «Никола Симов» и бул. «Република», водачката на Л.А. «Опел» Л.П. на 31 г. от гр. Варна не спазва пътен знак «Б2 – Спри! Пропусни движещия се по път с предимство» и е блъсната от Л.А. «Шкода». Вследствие на инцидента е пострадала водачката на Л.А. «Опел», която получава контузия на глава, прегледана и освободена, без опасност за живота." }, "geometry": { "type": "Point", "coordinates": [ 27.8748719, 43.224593 ] } },
{ "type": "Feature", "properties": { "DateTime": "2015-01-15T14:20:00.000Z", "ptptype": "car", "carRedSignal": "0", "carTurnLeft": "0", "carTurnRight": "0", "pedRedSignal": "0", "pedWrongCross": "0", "pedKid": "0", "danger": "0", "description": "На 15.01. т.г., около 14:20 часа, в гр. Варна, преди кръстовището на ул. «Ян Палах» и ул. «Брегалница», водачът на Л.А. «Дачия» А.А. на 33 г. от гр. Шумен, поради движение с несъобразена скорост, блъска Л.А. «Опел», спрял пред него. Вследствие на инцидента е пострадала пътничка от Л.А. «Опел», жена на 31 г. от гр. Варна, която получава контузия на глава и шия, прегледана и освободена, без опасност за живота." }, "geometry": { "type": "Point", "coordinates": [ 27.9165806, 43.2206212 ] } }
]
}

danger

Dmitry.

Re: XML parser

Думаю, что не много, добавил для создания своего проекта и видимо забыл внести в классы.

Dmitry.

Re: XML parser

Круто, спасибо!