XML dosya oluşturma ve Base64 çevirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Merhaba Arkadaşlar,

XML dosya oluşturma ve oluşturulan bu dosyanın base64 ile şifrelenmiş dosyasını oluşturmaya ihtiyacım var. Sitede bu işin nasıl yapılacağı ile ilgili net bir bilgiye ulaşamadım yada yorumlayamadım. Xmldocument veya farklı hiçbir component kullanmadan kayıtları database'den okuyup memo alana bilgileri satır satır ilgili tag ları kendim açıp kapatarak yazıyorum. Sonra bu dosyayı xml uzantılı olarak kaydediyorum. Oluşan dosyayı xml olarak browser'da açabiliyorum fakat türkçe karakterlerde hata veriyor, hatayı aşağıya yapıştırdım. Acil olarak bu konuda bana yardımcı olacak arkadaşlara minnettar olacağım. Xml dosya nasıl oluşturabilirim ve oluşturduğum bu dosyayı base64 formatında nasıl şifrelerim ? Şimdiden çok teşekkür ediyorum.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
XML sayfası görüntülenemiyor
XML girişi XSL stil sayfası kullanılarak görüntülenemez. Lütfen hatayı düzeltin ve Yinele düğmesini tıklatın veya daha sonra yeniden deneyin.

Metin içeriğinde geçersiz karakter bulundu.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

Merhaba,

Hangi sürüm Delphi kullandığınızı bildirmemişsiniz. Oluşturulacak XML dosyası içeriği ile ilgili hiç bilgi vermemişsiniz. XML dosyaları oldukça karmaşık olabiliyorlar. Sizin ihtiyaç duyduğunuz yapıyı bilmeden verilecek örnekler çok doğru olmayacaktır.

Delphi 7 için şu kaynaktaki örneği inceleyebilirsiniz: http://stackoverflow.com/questions/8354 ... -in-delphi
Delphi 10.1 için şu kaynaktaki örneği inceleyebilirsiniz: http://docwiki.embarcadero.com/CodeExam ... e_(Delphi)

Base64 ile ilgili olarak:
Delphi 7 için EncdDecd unit içindeki EncodeString(), DecodeString(), UTF8Encode(), UTF8Decode() fonksiyonlarını kullanabilirsiniz.
Delphi 10.1 için Soap.EncdDecd unit içindeki aynı fonksiyonları kullanabilirsiniz.

Burada dikkat etmeniz gereken konu bu fonksiyonların AnsiString türünde değer çevirdikleridir. Bunu sizin uygun şekilde farklı string türlerine çevirmeniz gerekecektir. Delphi 10.1 için verilmiş basit bir örnek şu şekilde olabilir:

Kod: Tümünü seç

uses
  Soap.EncdDecd;
  
function GetBase64(const Value: string): string;
begin
  Result := string(EncodeBase64(Pointer(Value), Length(Value)));
end;
Base64 ile ilgili olarak dikkat edilmesi gereken başka bir konu ise her 75 karakterde bir bu Encode eden fonksiyon CRLF (ENTER YENİ SATIR karakterleri) ekleyecektir. Eğer göndermeye çalıştığınız bilgiler bundan daha uzun ve arada enter karakteri olmaması gerekiyor ise bu konuyu da özellikle incelemenizde fayda var.

Browserlar dosyaların içeriklerini UTF-8 olarak gösterirler. Eğer sizin oluşturduğunuz dosya içeriği Ansi veya Unicode ise browser içinde türkçe karakterlerin düzgün gözükmemesi normaldir. Bu noktada dosya ouştururken Encoding seçeneğini doğru bir şekilde seçmeniz gerekecektir.

Biraz daha detay bilgi ve mümkünse oluşturulması gereken veri ve örnek kod paylaşabilirseniz sizin kullanımınıza özel örnekler verilebilir.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Merhaba Ertank,

Haklısınız bilgileri eksik vermişim ama yine de verdiğiniz linkler xml oluşturmam için yardımcı oldu. Verdiğiniz linklerde ki kodlardan faydalanarak kendi kodumu tamamladım, çok teşekkür ediyorum. Şu an xml dosya oluşturma problemim kalmadı, istediğim gibi oldu. Türkçe problemi de kalmadı. Bu arada Delphi 7 kullanıyorum. Base64 ile ilgili de delphi 7 için biraz daha detaylı anlatan bir link veya örnek bir kod verebilirseniz çok sevinirim. Kolay gelsin.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

Eski Delphi sürümlerinde (Delphi 7 dahil) UTF8Encode() ve UTF8Decode() fonksiyonları bozuktur. 3 byte üzerindeki sıralı bilgileri doğru bir şekilde işleyemiyor. Bu sorun Delphi 2009'da çözülmüştür.

Eğer UTF8 kullanıyor iseniz farklı bir kaynak kullanarak dönüşümler yapmanızda fayda var. Benim şahsi önerim mORMot projesi olacaktır.
https://synopse.info/fossil/wiki/Synopse+OpenSource

Şifreleme ve json konularında da faydalanabileceğiniz çok geniş bir kütüphaneye sahiptir.

Base64 ile ilgili aşağıdaki Delphi 7 örneğinin işinizi görmesi gerekli diye düşünüyorum.

Kod: Tümünü seç

uses
  EncdDecd;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := EncodeString(Edit1.Text);  // Base64 yap
  Edit3.Text := DecodeString(Edit2.Text);  // Normale çevir
end;
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Tekrar Merhaba,

Aşağıda ki kodu kullanarak xml dosyası oluşturabiliyorum artık, fakat oluşan dosyaya encoding=''UTF-8'' bilgisi gelmiyor. Aşağıda oluşan xml dosyasının ilk satırlarını görebilirsiniz. xml dosyasına encoding bilgisini nasıl getirebilirim ? Yardımlarınızı rica ediyorum.

----------------- Oluşan XML Dosyası ------------------
<?xml version="1.0" standalone="no" ?>
- <Faturalar>
- <Fatura>
- <FaturaBaslikBilgisi>
------------------------------------------------------------


Function xmlolustur(FIS_NO:double):double;
var xmlyaz,XMLDOSYASI: String;
var LineId: integer;
var StringList: TStringList;
var XML : IXmlDocument;
begin
StringList := TStringList.Create;

StringList.Add('<?xml version=''1.0'' encoding=''UTF-8'' standalone=''no''?>');
StringList.Add('<Faturalar>');
StringList.Add('<Fatura>');
StringList.Add('<FaturaBaslikBilgisi>');
StringList.Add('<VergiDairesi>'+VERGI_DA+'</VergiDairesi>');
StringList.Add('<VergiKimlikNo>'+VERGI_NO+'</VergiKimlikNo>');
StringList.Add('<FirmaAdi>'+HESAP_ADI+'</FirmaAdi>');
StringList.Add('<Adres>');
StringList.Add('<Ulke>'+ULKE+'</Ulke>');
StringList.Add('<Sehir>'+IL+'</Sehir>');
StringList.Add('<Ilce>'+ILCE+'</Ilce>');
StringList.Add('<CaddeSokak>'+CADDE_SOKAK+'</CaddeSokak>');
StringList.Add('<BinaAdi>'+BINA_ADI+'</BinaAdi>');
StringList.Add('<BinaNo>'+BINA_NO+'</BinaNo>');
StringList.Add('<PostaKodu>'+POSTA_KODU+'</PostaKodu>');
StringList.Add('</Adres>');
StringList.Add('<Iletisim>');
StringList.Add('<Telefon>'+TELEFON+'</Telefon>');
StringList.Add('<fax>'+FAX+'</fax>');
StringList.Add('<Mail>'+EMAIL+'</Mail>');
StringList.Add('</Iletisim>');
StringList.Add('<FaturaTarihi>'+DateToStr(FATURA_TARIHI)+'</FaturaTarihi>');
StringList.Add('</FaturaBaslikBilgisi>');

StringList.Add('<FaturaSatirlari>');
StringList.Add('<StokAdi>'+STOK_ADI+'</StokAdi>');
StringList.Add('<Birim>'+BIRIM+'</Birim>');
StringList.Add('<Miktar>'+FloatToStr(MIKTAR)+'</Miktar>');
StringList.Add('<ParaBirimi>TRY</ParaBirimi>');
StringList.Add('<Tutar>'+FloatToStr(ARA_TOPLAM)+'</Tutar>');
StringList.Add('</FaturaSatirlari>');

StringList.Add('</Fatura>');
StringList.Add('</Faturalar>');

ForceDirectories(xmldir);
if IOResult <> 0 then
showmessage('DİKKAT... Xml dosyası oluşturulamadı.')
else
begin
XMLDOSYASI:= 'Fatura'+IntToStr(FIS_NO)+'.xml';

XML := NewXMLDocument;
XML.Version := '1.0';
XML.Encoding:= 'UTF-8';

XML:= LoadXMLData(FormatXMLData(StringList.Text));
XML.SaveToFile(F_ANAMENU.xmldir+XMLDOSYASI);

showmessage(XMLDOSYASI+' dosyası başarı ile oluşturuldu.');
end;


end;
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

Gönderdiğim örnek üzerinden XML dosyası oluşturmamışsınız. Yine string değerleri kullanarak yapmaya çalışmışsınız. Doğru kullanım şekli aşağıdaki gibi olmalı.

Özellikle kodları içerleyerek yazmaya çalıştım ki hangi değer hangi "node" altına yazılıyor daha kolay anlaşılsın.

Kod: Tümünü seç

uses
 XMLIntf,
 XmlDoc;

procedure TForm1.Button1Click(Sender: TObject);
var
  Xml: IXMLDocument;
  RootNode, CurNode, FaturaSatirlari, Iletisim, Adres, FaturaBaslik, Fatura: IXMLNODE;
begin
  XML := NewXMLDocument;
  XML.Encoding := 'utf-8';
  XML.Options  := [doNodeAutoIndent]; // üst "node" bağlantısı olan değerler başında ekstra boşluk ile kaydedilmesi için

  RootNode         := XML.AddChild('Faturalar');
    Fatura         := RootNode.AddChild('Fatura');
      FaturaBaslik := Fatura.AddChild('FaturaBaslikBilgisi');
        CurNode  := FaturaBaslik.AddChild('VergiDairesi');
        CurNode.Text := 'Vergi Dairesi Değeri';

        CurNode  := FaturaBaslik.AddChild('VergiKimlikNo');
        CurNode.Text := 'Vergi Kimlik No Değeri';

        CurNode  := FaturaBaslik.AddChild('FirmaAdi');
        CurNode.Text := 'Firma Adı Değeri';

        Adres    := FaturaBaslik.AddChild('Adres');
          CurNode  := Adres.AddChild('Ulke');
          CurNode.Text := 'Ülke Değeri';

          CurNode  := Adres.AddChild('Sehir');
          CurNode.Text := 'Şehir Değeri';

          CurNode  := Adres.AddChild('Ilce');
          CurNode.Text := 'İlçe Değeri';

          CurNode  := Adres.AddChild('CaddeSokak');
          CurNode.Text := 'Cadde Sokak Değeri';

          CurNode  := Adres.AddChild('BinaAdi');
          CurNode.Text := 'Bina Adı Değeri';

          CurNode  := Adres.AddChild('BinaNo');
          CurNode.Text := 'Bina No Değeri';

          CurNode  := Adres.AddChild('PostaKodu');
          CurNode.Text := 'PostaKodu Değeri';

        Iletisim := FaturaBaslik.AddChild('Iletisim');
          CurNode  := Iletisim.AddChild('Telefon');
          CurNode.Text := 'Telefon Değeri';

          CurNode  := Iletisim.AddChild('fax');
          CurNode.Text := 'fax Değeri';

          CurNode  := Iletisim.AddChild('Mail');
          CurNode.Text := 'Mail Değeri';

          CurNode  := FaturaBaslik.AddChild('FaturaTarihi');
          CurNode.Text := 'FaturaTarihi Değeri';

        FaturaSatirlari := FaturaBaslik.AddChild('FaturaSatirlari');
          CurNode  := FaturaSatirlari.AddChild('StokAdi');
          CurNode.Text := 'Stok Adı Değeri';

          CurNode  := FaturaSatirlari.AddChild('Birim');
          CurNode.Text := 'Birim Değeri';

          CurNode  := FaturaSatirlari.AddChild('Miktar');
          CurNode.Text := 'Miktar Değeri';

          CurNode  := FaturaSatirlari.AddChild('Tutar');
          CurNode.Text := 'Tutar Değeri';

  Xml.SaveToFile(ExtractFilePath(Application.ExeName) + 'xml.xml');
end;
Yukarıdaki kod ile ouşturulan XML dosyası aşağıdaki içeriğe sahip oluyor:

Kod: Tümünü seç

<?xml version="1.0" encoding="utf-8"?>
<Faturalar>
  <Fatura>
    <FaturaBaslikBilgisi>
      <VergiDairesi>Vergi Dairesi Değeri</VergiDairesi>
      <VergiKimlikNo>Vergi Kimlik No Değeri</VergiKimlikNo>
      <FirmaAdi>Firma Adı Değeri</FirmaAdi>
      <Adres>
        <Ulke>Ülke Değeri</Ulke>
        <Sehir>Şehir Değeri</Sehir>
        <Ilce>İlçe Değeri</Ilce>
        <CaddeSokak>Cadde Sokak Değeri</CaddeSokak>
        <BinaAdi>Bina Adı Değeri</BinaAdi>
        <BinaNo>Bina No Değeri</BinaNo>
        <PostaKodu>PostaKodu Değeri</PostaKodu>
      </Adres>
      <Iletisim>
        <Telefon>Telefon Değeri</Telefon>
        <fax>fax Değeri</fax>
        <Mail>Mail Değeri</Mail>
      </Iletisim>
      <FaturaTarihi>FaturaTarihi Değeri</FaturaTarihi>
      <FaturaSatirlari>
        <StokAdi>Stok Adı Değeri</StokAdi>
        <Birim>Birim Değeri</Birim>
        <Miktar>Miktar Değeri</Miktar>
        <Tutar>Tutar Değeri</Tutar>
      </FaturaSatirlari>
    </FaturaBaslikBilgisi>
  </Fatura>
</Faturalar>
Burada dikkat edilmesi gereken nokta, XML.SaveToFile() prosedürü dosya var ise hata vermeden, onay almadan direk üzerine yazar. Eski dosyayı kaybedersiniz.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Yardımlarınız ve sabırlı yaklaşımınız için çok teşekkür ediyorum ertank, örneğinizdeki gibi oluşturdum xml dosyasını sorun çözüldü. Evet dediğiniz gibi string kullanarak oluşturursam xmldocument'i sonuç hatalı oluyor. Şu an xml oluşturmak ile ilgili sorunum kalmadı, tekrar teşekkürler. Bir sorum daha var ama o konuda da yardımcı olabilir misiniz acaba. UUID nasıl oluşturuluyor bu konuda da bana yardımcı olabilir misiniz.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

UUID (Uniqueidentifier) Microsoft firmasının kullandığı ifadedir. GUID (Globally Unique Identifier) ise genel kullanılan isimdir. Her ikiside aynı şeyi ifade etmektedir.

Yeni GUID oluşturmak için:

Kod: Tümünü seç

uses
  SysUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyGuid: TGuid;
  TempString: string;
begin
  if CreateGuid(MyGuid) <> 0 then
  begin
    ShowMessage('Guid oluşturulamadı');
    Exit;
  end;

  TempString := GuidToString(MyGuid);

  ShowMessage(TempString);
end;
Editör içinde GUID string kullanmak için CTRL + Shift + G tuş kombinasyonunu kullanabilirsiniz.

Eğer herhangi bir zamanda GUID oluşturma zamanında sorun yaşarsanız eğer ethernet kartı veya bir donanım bileşeninin arızalı olduğunu varsaymak çok yanlış olmayacaktır.

Bir şekilde String GUID değerini TGuid türüne dönüştürmeniz gerekirse:

Kod: Tümünü seç

// Yukarıdaki kodun devamı olacak şekilde düşünülürse
  try
    MyGuid := StringToGuid(TempString);
  except
    on E: EConvertError do
    begin
      ShowMessage('String değer GUID türüne dönüştürülemiyor.');
      Exit;
    end;
  end;
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

GUID oluşturma ile ilgili verdiğiniz kodu çalıştırdım, hiç bir sorun yaşamadım. Nokta atışı çözüm önerileriniz ve yardımlarınız için yeniden çok teşekkür ediyorum ertank. Bana çok yardımcı oldunuz, Allah razı olsun. Son olarak Base64 çevirme ile ilgili göndermiş olduğunuz kodu devreye alacağım, orada da sorun çıkacağını sanmıyorum. Çok Teşekkürler.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

ertank yazdı:Eski Delphi sürümlerinde (Delphi 7 dahil) UTF8Encode() ve UTF8Decode() fonksiyonları bozuktur. 3 byte üzerindeki sıralı bilgileri doğru bir şekilde işleyemiyor. Bu sorun Delphi 2009'da çözülmüştür.

Eğer UTF8 kullanıyor iseniz farklı bir kaynak kullanarak dönüşümler yapmanızda fayda var. Benim şahsi önerim mORMot projesi olacaktır.
https://synopse.info/fossil/wiki/Synopse+OpenSource

Şifreleme ve json konularında da faydalanabileceğiniz çok geniş bir kütüphaneye sahiptir.

Base64 ile ilgili aşağıdaki Delphi 7 örneğinin işinizi görmesi gerekli diye düşünüyorum.

Kod: Tümünü seç

uses
  EncdDecd;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := EncodeString(Edit1.Text);  // Base64 yap
  Edit3.Text := DecodeString(Edit2.Text);  // Normale çevir
end;

Tekrar Merhaba,

Base64 çevirmede şöyle bir sıkıntım var, xml dosyasını oluşturduğum anda aynı xml dosyasının birde base64 çevrilmiş halini yine xml uzantılı olarak kaydetmek istiyorum. Fakat Encoding işlemini xmldoc'da bulunan bilgiyi memo text'e atarak yaparsam eğer memo text'e türkçe karakterler bozuk geliyor ve memo text deki bilgiyi bozuk karakterler ile base64 yaparsam decode işleminde bu karakterlerin karşılığı bozuk olabilir diye düşünüyorum. Memo text kullanmadan oluşan xml dosyasının base64 koduna göre dönüştürülmüş halini nasıl oluşturabilir ve xml uzantılı olarak saklayabilirim. XML dosya oluşturma ve kaydetme işlemini tamamen sizin belirttiğiniz şekilde yaptım. Yardımınızı rica ediyorum.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

İlgili kodu paylaşabilir misiniz?
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Amacım şu : Sizin verdiğiniz örneğe uygun olarak xml dosyasını oluşturuyorum, oluşan dosyada hiçbir problem yok, her şey olması gerektiği gibi. Fakat şimdi bu dosyayı oluştururken aynı zamanda aynı dosyanın base64 koda çevrilmiş halinide xml uzantılı olarak kaydetmem gerekiyor. Aşağıda kodda BASE64 yazılı kısımda bunu yapmaya çalıştım. Bu çalışmamda ihtiyacım olan bir tek bu konu kaldı.

1. Oluşturduğum xml dosyasının bas64 koduna çevrilmiş halinin xml uzantılı olarak keydetmek.
2. Base64 formatta saklanmış bir dosyayı memo veya string alan içine alabilmek.

Yardımlarınız için çok teşekkür ediyorum.

Kod: Tümünü seç

 ForceDirectories(xmldir);
 if IOResult <> 0 then
    showmessage('DİKKAT... Xml dosyası oluşturulamadı.')
 else
 begin
    XMLDOSYASI:= 'Fatura'+IntToStr(FIS_NO)+'.xml';

    Memo2.Text := XMLDoc.XML.Text; //oluşan dosyayı görmek için.

    XMLDoc.SaveToFile(xmldir+XMLDOSYASI);
    XMLDoc.Active := False;

    showmessage(XMLDOSYASI+' dosyası başarı ile oluşturuldu.');

    //.. BASE64 ..//
    XML dosyasını kaydettikten sonra aynı dosyayı base64'e çevirerek yine xml uzantılı olarak kaydetmek istiyorum. Bunu yapabilmek içinde izlediğim    
    yol memo2.text i sizin verdiğiniz örnekte olduğu gibi base64 e çevirip memo2 alanının text bilgisini xmldoc'a yükleyip xml olarak kaydetmek.
    Aşağıda ki kodda bu anlattığımı yapmaya çalıştım fakat sanırım dosya formatına uymadığı için  
    XmlDoc:= LoadXMLData(FormatXMLData(Memo2.Text)); bu satırda hata veriyor.

    XMLDOSYASI:= 'Base64Enc'+'.xml';
    //.. Edit2.Text := EncodeString(Edit1.Text);  // Base64 yap
    //.. Edit3.Text := DecodeString(Edit2.Text);  // Normale çevir

    XmlDoc:= NewXMLDocument;
    XmlDoc.Version := '1.0';
    XmlDoc.Encoding:= 'UTF-8';
    XmlDoc.Active := True;
    XmlDoc.Options  := [doNodeAutoIndent]; // üst "node" bağlantısı olan değerler başında ekstra boşluk ile kaydedilmesi için
    XmlDoc.standalone:='no';

    Memo2.Text := EncodeString(Memo2.Text);

    XmlDoc:= LoadXMLData(FormatXMLData(Memo2.Text));
    XmlDoc.SaveToFile(xmldir+XMLDOSYASI);

    showmessage('Base64 çevirimi yapıldı.');

 end;
 
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen ertank »

Aşağıdaki gibi deneyebilir misiniz?

Kod: Tümünü seç

Memo2.Text := UTF8Decode(XMLDoc.Xml.Text);
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: XML dosya oluşturma ve Base64 çevirme

Mesaj gönderen mmg »

Bu sorunu da çözmüş olduk, ertank yardımların için çok teşekkür ediyorum.
Cevapla