Python ile UDF dosya oluşturma

Aşağıdaki kod ile yukarıdaki mesajda bahsettiklerimi yapmaya çalıştım ancak istediğimi elde edemedim.

import zipfile

with open("content.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()

    # Değiştirilecek içerik;
    # bu kısma bir fonksiyon tanımlayarak tüm değişiği fonksiyona yaptırmak daha mantıklı olacaktır.
    icerik = icerik.replace("Adı Soyadı", "Mustafa Halil")
    
     # değişiklik sonrası tüm içeriği "content.xml" adında dosya olarak kaydediyoruz.
    with open("content.xml", "w", encoding="utf-8") as dosya_cikti:
        dosya_cikti.write(icerik)

# "context.xml" dosyasını oluşturduktan sonra, Excel'den çekilen verilere  (örneğin "öğrenci adı") bağlı olarak, xml dosyasını zipleyip bu verinin adında (öğrenc adında) UDF dosyası oluşturabilirsiniz.

with zipfile.ZipFile('test2.udf', 'w') as myzip:
    myzip.write('content.xml')

UYAP Editörü ile basit bir dosya oluşturup içeriğini incelediğimde, herbir paragrafın ayrı ayrı özelliklerine göre ayrılmış ve metnin uzunluğunun burada belirtilmiş olduğunu gördüm.

Yani yukarıda bahsettiğim gibi bir mantıkla değişiklik yaparsak, değiştirdiğimiz ifadenin karakter uzunluğunu da hesaba katıp değiştirmemiz gerekecek.

Belki XML konusunu öğrenmek daha mantıklı olacaktır :slight_smile:

Merhaba, content.xml içindeki bilgileri şöyle dışarı çıkartabilirsiniz:

import xml.etree.ElementTree as ET


def extract_xml(root: ET.Element):
    data = []
    for element in root:
        data += [{"tag": element.tag}]
        if element.text and (text := element.text.strip()):
            data[-1]["text"] = text
        for attr, value in element.attrib.items():
            data[-1][attr] = value
        if len(element):
            data[-1]["children"] = extract_xml(element)
    return data
            
    
for element in extract_xml(ET.parse("content.xml").getroot()):
    print(element)
{'tag': 'content', 'text': 'UZLAŞTIRMA DAVETİYESİ\n\t\nŞÜPHELİ/SANIK/MAĞDUR/MÜŞTEKİ: - Kanunu Temsilcisi ADI SOYADI – 11111111111 T.C. Kimlik nolu, Baba adı ve Anne adı\n\n\nUzlaştırma No\t: 2022/\nSoruşturma No\t: 2022/\nMahkeme Esas No\t: 2022/\n\t\t\n... Cumhuriyet Başsavcılığı Uzlaştırma Bürosu tarafından Ceza Muhakemeleri Kanununun 253. Maddesi ve ilgili yönetmelikler uyarınca uzlaştırmacı olarak  görevlendirilmem nedeniyle;\n... Cumhuriyet Başsavcılığının yukarıda sayılı dosyasında ŞÜPHELİ/MÜŞTEKİ/KANUNİ TEMSİLCİSİ sıfatıyla yer almakta olduğunuz anlaşılmış olup, iş bu uzlaştırma davetiyesini tebliğ aldıktan itibaren 3 (üç) gün içerisinde adıma kayıtlı ........... nolu telefon ile irtibata geçmeniz, yahut halen uzlaştırmacı olarak görev yapmış olduğum Giresun Adliyesi Cumhuriyet Başsavcılığı Soruşturma Kalemine müracaat etmeniz, irtibata geçmediğiniz veya müracaat etmediğiniz takdirde uzlaşma teklifini kabul etmemiş sayılacağınız ve buna dair tarafımca tutanak düzenlenerek dosyanın iade edileceği hususlarında,\nBilgilerinize rica olunur. ...../...../.......\n\n\t\t\t\t\t\t\t\t  \nUzlaştırmacı        \n\t\t\t\t\t ¸e-imzalıdır'}
{'tag': 'properties', 'children': [{'tag': 'pageFormat', 'mediaSizeName': '1', 'leftMargin': '70.875', 'rightMargin': '70.875', 'topMargin': '70.875', 'bottomMargin': '70.875', 'paperOrientation': '1', 'headerFOffset': '20.0', 'footerFOffset': '20.0'}]}
{'tag': 'elements', 'resolver': 'hvl-default', 'children': [{'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '0', 'length': '22'}]}, {'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '22', 'length': '2'}]}, {'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '24', 'length': '114'}]}, {'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '138', 'length': '1'}]}, {'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '139', 'length': '1'}]}, {'tag': 'paragraph', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '140', 'length': '22'}]}, {'tag': 'paragraph', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '162', 'length': '22'}]}, {'tag': 'paragraph', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '184', 'length': '24'}]}, {'tag': 'paragraph', 'Alignment': '1', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '208', 'length': '3'}]}, {'tag': 'paragraph', 'Alignment': '3', 'FirstLineIndent': '42.857143', 'children': [{'tag': 'content', 'startOffset': '211', 'length': '180'}]}, {'tag': 'paragraph', 'Alignment': '3', 'FirstLineIndent': '42.857143', 'children': [{'tag': 'content', 'startOffset': '391', 'length': '58'}, {'tag': 'content', 'bold': 'true', 'startOffset': '449', 'length': '33'}, {'tag': 'content', 'startOffset': '482', 'length': '105'}, {'tag': 'content', 'bold': 'true', 'startOffset': '587', 'length': '21'}, {'tag': 'content', 'startOffset': '608', 'length': '380'}]}, {'tag': 'paragraph', 'Alignment': '3', 'FirstLineIndent': '42.857143', 'children': [{'tag': 'content', 'startOffset': '988', 'length': '25'}, {'tag': 'content', 'bold': 'true', 'startOffset': '1013', 'length': '21'}, {'tag': 'content', 'startOffset': '1034', 'length': '1'}]}, {'tag': 'paragraph', 'children': [{'tag': 'content', 'startOffset': '1035', 'length': '1'}]}, {'tag': 'paragraph', 'Alignment': '2', 'children': [{'tag': 'content', 'startOffset': '1036', 'length': '9'}, {'tag': 'content', 'bold': 'true', 'startOffset': '1045', 'length': '2'}]}, {'tag': 'paragraph', 'Alignment': '2', 'children': [{'tag': 'content', 'bold': 'true', 'startOffset': '1047', 'length': '19'}, {'tag': 'content', 'startOffset': '1066', 'length': '2'}]}, {'tag': 'paragraph', 'Alignment': '2', 'children': [{'tag': 'content', 'startOffset': '1068', 'length': '6'}, {'tag': 'image', 'family': 'Times New Roman', 'size': '11', 'resolver': 'hvl-default', 'imageData': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAIAAABbzbuTAAABfklEQVR42mP4TyJgQOY8v3nrfnIy kASyb7e23ykvh7DxaXjKJQlHR0JDixPSsWgAqoOgh2lpyBqAaH5Y5L1jJ5HtgWpY5ugEUXHU1m6D jeUiM5P11pYX7e0ggoe7+q6dOofipLObtkHkdlpbrPQPBBpx9rLG9YwMoEi9hXWosemCKXNRNFw6 dR6iYauNJVDpp98sQPTs4mWgSKG55YTGLnRP3y0vhzraxOzNhUvnLmsAtR2eveh5Vtb1QL/1nRPQ /XC7sXG/nx/Ur8XFp2Yv2NI16Xpn957IyEXu7nlWdtvXb0Ox4d7FyzW5xbPNjIEauk3MnubmPq+u PpWQYKOulRIeX5yWu2r+cizxALGhXEsjRknpsJvzSnt7RUkZfBEHClYrcxdhoWVW5jd09GvV1eUk pAhoAKKTtlYXj5+BsIEBSlhDk5V1sKHJJXtbojQsc3YGKuqqaT2+cNkNA2MCGq539QBV5MES3I4Z 8whoAILWsvrTJ8/BuTs37URTAACMFlNfLuikWQAAAABJRU5ErkJggg==', 'startOffset': '1074', 'length': '1'}, {'tag': 'content', 'family': 'Times New Roman', 'foreground': '-4194304', 'bold': 'true', 'size': '11', 'italic': 'true', 'resolver': 'hvl-default', 'startOffset': '1075', 'length': '11'}, {'tag': 'content', 'resolver': 'hvl-default', 'startOffset': '1086', 'length': '1'}, {'tag': 'content', 'startOffset': '1087', 'length': '8'}]}]}
{'tag': 'styles', 'children': [{'tag': 'style', 'name': 'default', 'description': 'Geçerli', 'family': 'Dialog', 'size': '12', 'bold': 'false', 'italic': 'false', 'foreground': '-13421773', 'FONT_ATTRIBUTE_KEY': 'javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]'}, {'tag': 'style', 'name': 'hvl-default', 'family': 'Times New Roman', 'size': '12', 'description': 'Gövde'}]}

Python ile XML dosyaları ile işlem yapabilmek için aşağıdaki API’lar mevcutmuş ;

  • The ElementTree XML API:

The ElementTree XML API 1
The ElementTree XML API 2

xml.etree.ElementTree modülü, XML verilerini ayrıştırmak ve oluşturmak için basit ve verimli bir API uygular.
Uyarı:
xml.etree.ElementTree modülü kötü niyetle oluşturulmuş verilere karşı güvenli değildir. Güvenilmeyen veya kimliği doğrulanmamış verileri ayrıştırmanız gerekiyorsa XML güvenlik açıklarına bakın.

  • lxml API:

lxml - XML and HTML with Python

lxml XML araç seti, C kütüphaneleri libxml2 ve libxslt için Pythonic bir bağlayıcıdır. Bu kütüphanelerin hızını ve XML özelliklerinin eksiksizliğini, çoğunlukla uyumlu ancak iyi bilinen ElementTree API’sinden daha üstün olan yerel bir Python API’sinin basitliği ile birleştirmesi bakımından benzersizdir.

Sayın katılımcılar.

Anafikri anladığımızdan emin olalım.

Ortada şöyle bir sorun var.

Uyap editörü kendisine sıkıştırılmış bir xml dosyasını formal olarak kullanmış.

Ve DOM adında bir mantıkla kendi template/şablonlarını kullanıyor.

Burada editöre tersine mühendislik uygulayabilir ve editörün nasıl işediğini bulabiliriz.

XML işlemek için sayısız kütüphane ve sayısız yöntem var.

Ama asıl mesele bu standart bir şablon değil. Uyap için yazılımı hazırlayanların keyfekeder bir formatı.

Yani bu şablonu çözümlemek ve düzeltmek ömrünüzü harcamak isteyeceğiniz bir şey olmamalı.

Hayat bununla uğraşmak için çok kısa.

Editörün kullandığı jar içinde derlenmiş sınıflar var. Buradan ipuçları bulabilirsiniz.

Sorun şu ki dokümantasyonu ve referansları olmayan bir dosya formatı ile uğraşmak iğne ile kuyu kazmak gibidir.

Zaman harcamak için ücretli bir yazılım hazırlamak isteyen olabilir. Yada stadandart bir doküman oluşturup ufak değişiklikleri otomatize edebilirsiniz ama uyap dokümanının alternatifi tam bir doküman oluşturmak asla garanti edilemez.

Yine ne tür bir xml api tercih edersiniz derseniz.

What is SAX in XML? - GeeksforGeeks

SAX

Neden derseniz;

Yani editördeki ipuçları size bir şeyler verebilir.

Ama bu kadar enerji harcamaya değer mi emin değilim.

Yine vaktim olursa format üzerine çalışırım ama tüm enerjimizi buraya harcamaya değer bir şey göremiyorum.

Kolay gelsin.

1 Beğeni

Öncelikle terkrar tekrar emek verdiği için herkese teşekkür ederim.

  1. İçini excelden çektiğim verileri yerleştireceğim çerçeve udf dosyasını yazdım.
  2. Mahkeme adı, dosya numarası gibi excelden çekilen verilerin yerleştirileceği alanları {} ile boş bıraktım ki format metodu ile değişiklik yapabileyim.
  3. Buradaki kodlar ile hazırladığım udf dosyasının içindeki content.xml dosyasını unzip ettim. 4) Unzip edilen content.xml dosyasının içindeki <![CDATA[ kısmındaki metni ekrana yazdırmayı yine buradaki kodlar ile başardım.
  4. Bu <![CDATA[ içindeki çerçeve dilekçe zaten hazır ve değişiklik yapılacak kısımlar {} ile yazılı. Burada son birkaç işlem kaldı;
    a) <![CDATA[ içindeki veriyi bir string değişkeni olarak ayırmak,
    b) print fonksiyonu ile değiştirmek ve xml dosyasına yazdırmak,
    c) udf olarak exceldeki verilerden birini dosya adı olarak kullanacak şekilde ziplemek,
    d) Exceldeki satır sayısı kadar bunu döngü olarak yapmak ve her satır için ayrı bir şablon dilekçe hazırlamak.

Yapmaya çalıştığım kısım buraya kadar olsa da, ileride imzalamak ve UYAP portalına veri göndermek gibi işlevleri de hayal etmiyor değilim. Neredeyse sıfır python bilgim ile bu aşamaya kadar gelmem bile sizlerin sayesinde oldu. Eğer öğrenir de bu aşamaları çözebilirsem sizlerle paylaşacağım.

  1. Mahkeme adı, dosya numarası gibi excelden çekilen verilerin yerleştirileceği alanları {} ile boş bıraktım ki format metodu ile değişiklik yapabileyim.

UYAP editörü ile bir şablon dosya oluştururken, değiştirmek istediğiniz kısımları “Mahkeme adı", "dosya numarası”, “tc_kimklik_no”, … gibi sabit ve bildiğiniz ifadelerle kaydederseniz, excelden çektiğiniz verileri bu değerlerle replace() metodu ile kolayca değiştirebilirsiniz.

4 a) <![CDATA[ içindeki veriyi bir string değişkeni olarak ayırmak,

Metin içinden veri ayıklamak,…vb işlemler için Düzenli ifadeler (regex) konusuna göz atabilirsiniz. (re modülü) Ancak bunu neden yapmak istediğinizi anlamadım.
Düzenli ifadeler konusunda kaynak önerisi: mhalil - Programlama ve 3D

4 b) print fonksiyonu ile değiştirmek ve xml dosyasına yazdırmak,

Yanlış bilmiyorsam print() fonksiyonu, sonucu ekrana basmak / görüntülemek için kullanılıyor. bunu nasıl xml dosyasına yazdıracaksınız? print() fonksiyonunu bir değişkene atayarak mı yapmayı planlıyorsunuz? daha önce bu yöntemi hiç denemedim :slight_smile: Değişiklik yapma konusda replace() metodunu kullanabilirsiniz.

c) udf olarak exceldeki verilerden birini dosya adı olarak kullanacak şekilde ziplemek,
d) Exceldeki satır sayısı kadar bunu döngü olarak yapmak ve her satır için ayrı bir şablon dilekçe hazırlamak.

Bunlar oldukça kolay.

Merhaba,
Emek veren herkese teşekkür ederim.
Xml değişikliği yapıp kaydetmeyi başardım fakat sıkıştırılmış yeni udf dosyasında tasarım kayması oluyor. Editörde yazılan tüm metni düz bir yazı olarak ele alıyor ve aslında tam bir dizi olarak kullanıyor. Şöyle ki;

<paragraph>
<content startOffset="0" length="171"/>
</paragraph>

paragraph sadece döküman editöründe enter tuşuna basınca çıkıyor.
startOffset ise bir stil kuralının başladığı karakteri belirtiyor. length ise o stil kuralının uygulanacağı karakter sayısını belirtiyor.

<paragraph>
<content bold="true" startOffset="172" length="33"/>
</paragraph>

Burada düz yazının 172. karakterinden itibaren 33 karakterin koyu olduğu kuralı belirtiliyor.

Şablon udf dosyasında {} İCRA MÜDÜRLÜĞÜ’NE şeklinde yazdığım yazı excelden aldığım veriyi çekiliyor ve format metodu ile yazıya ekleniyor.

İki karakter olan {} yerine İstanbul 1. İcra Müdürlüğü eklenince düzyazı metni değişmesine rağmen kuralların uygulanacağı karakter sayıları aynı kalıyor.

Tasarımın aynı kalması için excelden çekilen verrilerin len() fonksiyonu ile uzunluğu alınarak startOffset ve ve length değerlerini güncelleyecek bir kod yazmak gerekiyor.

Döngü ve dosya ismini verme kısmına sonra bakacağım. En son da kullanıcının kolayca şablonu yükleyip excelde veri seçebileceği bir GUI oluşturmak kalacak.

Python ile UDF dosya oluşturma - m.halil tarafından #23 bu mesajımda bundan bahsetmiştim. Şöyle ki;

Yani yukarıda bahsettiğim gibi bir mantıkla değişiklik yaparsak, değiştirdiğimiz ifadenin karakter uzunluğunu da hesaba katıp değiştirmemiz gerekecek.
Belki XML konusunu öğrenmek daha mantıklı olacaktır :slight_smile:

Tasarımın aynı kalması için excelden çekilen verrilerin len() fonksiyonu ile uzunluğu alınarak startOffset ve ve length değerlerini güncelleyecek bir kod yazmak gerekiyor.

Sanıyorum bu isteğinizi de re modülü (regex , düzenli ifadeler) ile gerçekleştirebilirsiniz.

Oluşturduğunuz şablonu ve örnek bir excel listesi paylaşırsanız biz de aynı dosya üzerinde çalışabiliriz. (Verilerin doğru olması şart değil, excel’e rastgele veriler yazabilirsiniz. Önemli olan excel dosyasının ve xml dosyasının yapısını görmek.)
Aynı dosya üzerinde çalışırsak olası hataları görür ve çözüm yöntemlerini daha hızlı sunabiliriz.

Önemli olan ubl hangi versiyon. 2.1 oluyor genelde ve bu standarta gore xml olusturup validationla test etmek. Bakanlikta bunla ilgili ornekler mutlaka vardir.