XML’den JSON’a dönüştürücü

XML’i JSON’a veya JSON’u XML’e dönüştürün; @ ile öznitelikler, #text, tüm belgenin belirlediği diziler ve XML’in iyi biçimli olmadığı satır ve sütun ile.

Girinti
Girdi
Çıktı

Çıktı burada görünecek

Bu araç ne yapar

XML genellikle kimsenin seçmediği sistemlerden gelir: bir SOAP yanıtı, bir RSS akışı, bir yapılandırma dosyası, JSON’dan daha eski bir şeyden alınmış bir dışa aktarım. Onu kullanması gereken kod JSON ister. Tersi de en az o kadar yaygındır: yalnızca XML kabul eden bir sisteme gidecek bir JSON yükü. Bu sayfa iki yönde de, tarayıcınızda dönüştürür ve iki biçimi de tek bir sabit kurallar kümesiyle okur; böylece iki yön, her anahtarın ne anlama geldiği konusunda uyuşur.

Onu farklı kılan, JSON’un şeklinin o an okunan öğeye göre değil tüm belgeye göre belirlenmesi ve sayfanın bunu söylemesidir. Bu karar bir öğeye tek başına alacağından farklı bir şekil verdiği her yerde, çıktının altındaki bir duyuru yolu ve kararın ilk uygulandığı satır ile sütunu adıyla anar. JSON’da yeri olmayan şeyler, yorumlar ya da karışık içeriğin sırası gibi, kaybolmak yerine aynı biçimde duyurulur; öteki yönde de XML’in JSON’unuza dayattığı her yeniden yazma, gerçekleştiği yerde adıyla anılır.

Kurallar: öznitelik için @, metin için #text

Tek bir kurallar kümesi vardır ve hiçbir ayar onu değiştirmez. Bir öznitelik, @ ve ardından özniteliğin adıyla yazılan bir anahtar olur ve öğesini başka herhangi bir şeyle paylaşmak zorunda olan metin #text anahtarının altına gider. Ne @ ne de # bir XML adını başlatabilir; bu yüzden bu biçimde yazılan hiçbir anahtar bir alt öğeyle karıştırılamaz ve aynı JSON’un tahmin yürütmeden yeniden XML olarak okunabilmesini sağlayan da budur. Küçük bir katalog üzerinde:

  • Kök öğesi en üstteki tek anahtardır: kök öğesi catalog olan bir belge, tek anahtarı "catalog" olan bir nesne olur.
  • Metinden başka hiçbir şey tutmayan bir öğe o metnin kendisidir: <title>Midnight Rain</title> öğesi "title": "Midnight Rain" olur.
  • Bir öznitelik, alt öğelerin yanında duran bir anahtardır: <book id="bk101"> kitaba "@id": "bk101" verir ve her alt öğe, ilk göründüğü sırayla, ardından bir anahtar olarak gelir.
  • Öznitelikleri ve metni olan bir öğe metnini #text altında tutar: <price currency="USD">44.95</price> öğesi "price": {"@currency": "USD", "#text": 44.95} olur.
  • Aynı üst öğenin altında tekrarlanan bir öğe dizi olur: author öğesi iki kez geçen bir kitapta "author": ["Gambardella, Matthew", "Knorr, Stefan"] bulunur.
  • Adlar, önekiyle birlikte tam yazıldıkları gibi korunur: <dc:title> öğesi "dc:title" anahtarı olur, bir ad alanı bildirimi "@xmlns:dc" gibi bir öznitelik anahtarı olur ve hiçbir şey bir ad alanı URI’sine çözümlenmez.

Varlıklar ve karakter referansları çözülür; böylece &amp; & olarak, &#233; de é olarak gelir ve bir CDATA bölümü düpedüz metindir. Öğelerin arasında tek başına duran boşluk biçimlendirmedir ve atılır; metnin geri kalan her parçası tam olarak korunur ve hiçbir zaman kırpılmaz. Uyumlu her XML ayrıştırıcısının uyguladığı iki normalleştirme yine önce gelir: metne yazılan bir satır başı satır beslemesi olarak, bir öznitelik değerine yazılan bir sekme ya da satır sonu da boşluk olarak gelir. Bir belge bunlardan herhangi birini bir karakter referansıyla korur.

Şekle neden tüm belge karar verir

Her seferinde tek bir öğeye karar veren bir dönüştürücü, ilk kitabın yazarlarını iki tane oldukları için dizi olarak, ikincinin yazarını da tek olduğu için dize olarak yazar. Öznitelik taşıyan bir öğe bir kayıtta nesne, bir sonrakinde düz metindir. İlk kayda göre yazılmış kod ikincide bozulur ve bu arada hiçbir şey şeklin değişebileceğini söylememiştir.

Bu yüzden şekle yol başına karar verilir: yol, kökten bir öğeye kadar inen öğe adlarıdır ve içinde hiçbir konum olmadan /catalog/book/author diye yazılır; böylece her kitabın her yazarı tek bir yol üzerinde durur. Bir yoldaki bütün öğeler birlikte değerlendirilir:

  • Diziler. Öğe herhangi bir üst öğenin altında tekrarlanıyorsa, yoldaki her öğe, tek başına duran bir öğe de dahil, dizi olarak yazılır.
  • Nesneler. Yoldaki herhangi bir öğe bir öznitelik ya da bir alt öğe taşıyorsa, yoldaki her öğe, yalnızca metin tutan bir öğe de dahil, nesne olarak yazılır ve metnini #text altında tutar.
  • Değerler. Bir yol, aşağıda sayılar ve mantıksal değerler için anlatılan kurala göre, yalnızca üzerindeki her değer dönüştüğü yerde sayı olarak, yalnızca her değer true ya da false olduğu yerde de mantıksal değer olarak okunur.
  • Boş öğeler. Boş bir öğe bu kararlarda hiçbir rol oynamaz ve yolunun karar kıldığı değer türünü alır.

Sonucun bir öğenin tek başına olacağından farklı olduğu her yerde, sayfa bunu yol için bir kez, değiştirdiği ilk öğenin satırı ve sütunuyla birlikte söyler. Bir kitabın birkaç yazarı, bir başkasının tek yazarı olan bir katalogda o tek yazar yine de bir dizidir; bir fiyatın currency özniteliği taşıdığı, bir başkasının taşımadığı yerde de düz fiyat yine de bir nesnedir ve metni #text altındadır. İkisi de duyurulur; böylece hiçbiri onları okuyan kodu şaşırtmaz.

Tek kayıtlı bir örnek ve «Her zaman dizi» alanı

Şekil, ancak kendisine karar verilen belge kadar iyi olabilir. Tek bir kitap tutan bir katalog yapıştırın: o kitap bir nesne, tek yazarı bir dize, fiyatı da bir sayı olur; oysa aynı katalog, yanında ikinci bir kitapla, kitapları bir dizi yapar. Yapıştırdığınız şeyin her yerinde bir kez geçen bir yol tek bir değer olarak kalır; değerlerinin hepsi tesadüfen dönüşen bir yol da, sıfırla başlayan bir posta kodu taşıyan bir belge gelene kadar sayı olarak kalır. JSON tam olarak örnek ne kadar temsil ediciyse o kadar güvenilirdir; bu yüzden yapabildiğiniz her durumda birden fazla kayıt yapıştırın.

Diziler için örneğe bağlı olmayan bir çare var. Belge ne gösterirse göstersin dizi olması gereken öğe adlarını ya da yolları, virgül ya da boşlukla ayırarak «Her zaman dizi» alanına yazın; bir maddenin eşleştiği her yol, yalnızca bir kez geçtiği yerde bile her yerde dizi olarak yazılır:

  • item gibi yalın bir ad, nerede durursa dursun, adı item olan bir öğeyle biten her yolla eşleşir.
  • /rss/channel/item gibi bir yol yalnızca o yolla eşleşir ve çıktının altındaki yollar nasıl yazılıyorsa öyle yazılır; böylece bir yol oradan kopyalanabilir.
  • Eşleşme birebirdir: büyük-küçük harf önemlidir ve önek adın bir parçasıdır; bu yüzden Item hiçbir item ile, link de hiçbir atom:link ile eşleşmez.
  • Alanın diziye çevirdiği her yol, diğer her karar gibi duyurulur. Ne bir ad ne de bir yol olan bir madde ve belgedeki hiçbir öğeyle eşleşmeyen bir madde alanın altında listelenir ve uygulanan maddeler de uygulanmaya devam eder.

Alan «XML’den JSON’a» yönüne aittir. Yönü değiştirip geri döndüğünüzde yazdığınızı korur ve sayfadaki her ayar gibi ziyaretler arasında saklanmaz. Değerlerin böyle bir alanı yoktur: «Sayıları ve mantıksal değerleri dönüştür» düğmesini kapatmak, örnek ne tutarsa tutsun metin olarak kalması gereken bir yol içindir; bedeli, diğer her değerin de metne dönüşmesidir.

Sayılar, mantıksal değerler ve 02134 neden metin kalır

XML’de her şey metindir ve sayısal görünen metni JSON sayılarına dönüştürmek genellikle istediğiniz şeydir. 02134 posta kodunun 2134 olması ve uzun bir sipariş numarasının son basamaklarını yitirmesi de böyle olur. Buradaki kural, bu sitedeki CSV dönüştürücünün kullandığı kuraldır ve özel durumlardan oluşan bir listeye ihtiyaç duymaz: metin, yalnızca o sayı yeniden yazıldığında metni birebir ürettiği yerde sayı olur. 42 üretir, dolayısıyla dönüşür. 02134 üretmez; 1.50, +5, 1e5 ve bir double’ın her basamağını tutamayacağı kadar uzun bir tam sayı da üretmez. Mantıksal değerler tam olarak, küçük harfle, true ve false değerleridir.

Bu sayfanın eklediği şey, kuralın bütün bir yola aynı anda uygulanmasıdır. Bir yol yalnızca üzerindeki her değer dönüşüyorsa sayı olarak, yalnızca her değer mantıksal değerse de mantıksal değer olarak okunur; bir basamak kaybedecek tek bir değer ya da aynı yolda buluşan sayılar ve mantıksal değerler, oradaki her değeri metin olarak bırakır. Bir yoldaki her öznitelik adına ayrı ayrı karar verilir. Değerlerinden bazıları dönüşebilecekken metin olarak bırakılan bir yol, yolun adı verilerek duyurulur; bir öznitelik için yol, /catalog/book/@id gibi, özniteliğin kendisinde biter.

«Sayıları ve mantıksal değerleri dönüştür» sayfa açıldığında açıktır, tıpkı CSV sayfasındaki karşılığı olan düğme gibi; onu kapatmak her değeri metin olarak yazar. Bir ad alanı bildiriminin değeri, düğme ne durumda olursa olsun asla sayı olarak okunmaz, çünkü Namespaces in XML standardı bu değeri bir ad alanı adı olarak tanımlar ve bu bir metindir.

Boş öğeler ve belgenin kendi belirttiği null

  • Boş bir öğe, yolunun karar kıldığı değer türünü alır. Metin taşıyan bir yolda boş dize olur. Sayı ya da mantıksal değer taşıyan bir yolda null olur ve sayfa bunu söyler, çünkü öğe tek başına boş metin olurdu.
  • Boş, içinde kesinlikle hiçbir şey olmaması demektir: <zip> </zip> bir boşluk tutar ve boşluk metindir.
  • Her öğesi boş olan bir yol metindir, dolayısıyla her biri boş dizedir. Orada hiçbir şey sayı olarak okunmaz ve bir null, belgenin hiç vermediği bir bilgi olurdu.
  • Nesne olarak yazılan bir yolda, yoldaki başka bir öğe metin tuttuğu her yerde boş bir öğe de aynı kurala göre boş ya da null olan bir #text taşır: <price currency="USD">5</price> öğesinin yanında bir <price/> öğesi {"#text": null} olur. Yoldaki hiçbir öğenin metin tutmadığı yerde, yalnızca bir src özniteliği taşıyan görsel öğelerinde olduğu gibi, hiçbiri #text taşımaz.

Bir belge null değerini kendisi de belirtebilir. xsi:nil="true" taşıyan ve bu öneki XML Schema instance ad alanına bağlı olan bir öğe, «Sayıları ve mantıksal değerleri dönüştür» nasıl ayarlanmış olursa olsun, her yolda null olur. Bu, belgenin veri yerine null deme biçimidir; bu yüzden ne öznitelik ne de başka hiçbir şeyi bağlamayan bir ad alanı bildirimi JSON’da görünür. O ad alanına bağlı her önek işe yarar ve i:nil="1" de aynı şeyi söyler; xsi:nil="false" sıradan veridir ve nil olarak belirtilmiş ama hâlâ içerik tutan bir öğe olduğu gibi bırakılır, çünkü onu null olarak okumak o içeriği tek söz etmeden atmak olurdu.

JSON’da yeri olmayan şeyler, kaybolmak yerine duyurulur

Bir XML belgesinin tuttuğu şeylerin bir kısmının JSON’da yeri yoktur. Anlam taşıyanlar sessizce atılmak yerine çıktının altında duyurulur:

  • Karışık içeriğin sırası. <p>Hello <b>world</b>, again</p> içinde metin #text altında "Hello , again" olarak, b öğesi de "b" altında toplanır: her karakter ve her öğe korunur, ama durdukları sıra korunmaz. Farklı adlar arasında gidip gelen alt öğeler de sıralarını aynı biçimde yitirir. Bu, içeriği o olan öğenin yolu için bir kez ve yalnızca sıra gerçekten kaybolduğunda duyurulur; bu yüzden <p><b>Note:</b> the rest</p> hiçbir duyuruya yol açmaz, çünkü anahtarlarının sırası onu korur.
  • Yorumlar ve işleme yönergeleri. JSON’a alınmazlar; her çeşit için, kaç tane olduğunu ve ilkinin nerede durduğunu söyleyen bir duyuru verilir.
  • DOCTYPE. O da JSON’a alınmaz ve duyurusu DTD’nin uygulanmadığını söyler: DTD’nin bir öznitelik için bildirdiği varsayılan değer JSON’da yer almaz, çünkü bu araç DTD’yi okumaz.
  • En üstteki XML bildirimi. Hiçbir duyuru olmadan JSON’a alınmaz, çünkü verinin ne olduğunu değil metnin nasıl kodlandığını anlatır.

JSON’dan yeniden XML’e: en yakın XML ve adıyla anılan her yeniden yazma

Yönü değiştirin, aynı kurallar ters yönde işler: bir @ anahtarı öznitelik, #text ait olduğu öğenin metni, bir dizi her üyesi için bir öğe ve diğer her anahtar bir alt öğe olur; alt öğeler, anahtarlarının durduğu sırayla gelir. Bir null, xsi:nil="true" taşıyan boş bir öğe olarak yazılır; XML Schema instance ad alanı kök öğesinde bir kez ve yalnızca bir null yazıldığında bildirilir, böylece geri dönüştürmek boş bir dize yerine yeniden null verir. Ayrıştırılamayan ya da dönüştürülemeyecek kadar derin iç içe geçen JSON dışında hiçbir şey reddedilmez. JSON’unuzun XML’in olduğu gibi taşıyamayacağı bir şekli olduğu yerde, en yakın iyi biçimli XML yazılır ve yeniden yazma çıktının altında, bu sitedeki JSONPath test aracına yapıştırabileceğiniz bir JSONPath ile adıyla anılır:

  • Tek bir kök öğesinden başka her şey — en üstte birden çok anahtar, hiç anahtar olmaması, en üst düzeyde bir dizi ya da yalın bir değer — <root> içine yazılır.
  • XML adı olmayan bir anahtar, yanındaki başka hiçbir anahtarın yazılmadığı en yakın adla yazılır: first name anahtarı first_name olarak, 1st anahtarı da _1st olarak yazılır.
  • Hiçbir anahtarın adlandırmadığı bir dizinin üyesi, ister başka bir dizinin içinde ister en üstte dursun, bir <item> öğesi olarak yazılır.
  • Bir nesne ya da dizi taşıyan bir @ anahtarı ya da #text, bir alt öğe olarak yazılır, çünkü bunu ne bir öznitelik ne de bir metin taşıyabilir.
  • null taşıyan bir @ anahtarı dışarıda bırakılır; alt öğelerin yanında null taşıyan bir #text de öyle, çünkü XML null olduğunu yalnızca bütün bir öğe için söyler.
  • Bir referans olarak bile XML 1.0 içinde hiçbir biçimde yer alamayan bir karakterin yerine başka bir karakter yazılır ve sayfa bunun nerede olduğunu söyler.

Kaçışlama bir seçenek değil, iyi biçimli XML yazmanın bir parçasıdır. Bir < ve bir & her zaman kaçışlanır. Bir öznitelik değerinde çift tırnak da kaçışlanır, çünkü değer iki çift tırnağın arasına yazılır; orada bir sekme, bir satır beslemesi ya da bir satır başı karakter referansı olarak yazılır, çünkü aksi hâlde bir ayrıştırıcı onu boşluğa çevirirdi. Metinde bir satır başı referans olarak yazılır, çünkü aksi hâlde bir ayrıştırıcı onu satır beslemesine çevirirdi; ]]> de hiçbir zaman olduğu gibi yazılmaz. Değerin, yazdığınız değer olarak geri okunmasını sağlayan budur.

Geri dönüştürmenin vereceği sonuç, siz dönüştürmeden önce söylenir

Bazı XML’ler iyi biçimli olduğu hâlde, yazıldığı JSON’dan başka bir şey olarak geri okunur; bu yüzden sayfa az önce yazdığı XML’i öteki yönün kullandığı kurallarla okur ve yanıtın nerede farklılaştığını söyler. Tek üyeli bir dizi, aynı öğeler belgenin başka bir yerinde aynı üst öğenin altında tekrarlanmıyorsa, tek üyesi olarak geri okunur. Boş bir dizi hiçbir öğe, boş bir #text de hiçbir metin yazmaz; bu yüzden ikisi de hiçbir şey olarak geri okunur. Öznitelik ya da alt öğe olarak yazılan hiçbir şey tutmayan bir nesne basit bir değer olarak geri okunur; aynı öğelerin başka bir yerde, JSON’unuzda olmayan bir dizi ya da nesneye belgenin karar vermesine yol açtığı yerde de bu söylenir. Bunların her biri JSON’unuzdaki hâliyle yazılır ve duyurulur.

«Girdi olarak kullan» düğmesi çıktıyı girdi bölmesine taşır ve yönü değiştirir; böylece geri gelen şey ve onun duyurdukları bir tık uzaklıktadır. Hiçbir şeyin duyurulmadığı yerde geri gelen, XML’in saklamadığı şeyler dışında sizin JSON’unuzdur. XML metni bir değerin sayı mı, mantıksal değer mi yoksa dize mi olduğunu kaydetmez: «Sayıları ve mantıksal değerleri dönüştür» açıkken bir sayıyı birebir yazan bir dize o sayı olarak geri gelebilir, kapalıyken de her değer metin olarak geri gelir. Ayrıca bir öznitelik ya da boş veya null bir #text, yanındaki anahtarların arasında başka bir yerde geri gelebilir, çünkü XML bu konumu saklamaz.

XML tarafından başlayan gidiş dönüş bilerek daha az şey vaat eder. Yapıştırdığınız metin geri gelmez: XML bildirimi, biçimlendirme, yorumlar ve gidişte duyurulan diğer her şey gitmiştir. Sabit kalan, sayfanın yazdığı XML’dir: onu aynı ayarlarla JSON’a, sonra yeniden XML’e dönüştürün, aynı XML geri gelir.

XML ya da JSON okunamadığında

XML ayrıştırıcısının okuyamadığı bir belge, neyin yanlış olduğunu söyleyen bir cümleyle ve verilecek bir yer olduğu her durumda bir satır ve sütunla reddedilir: hiç kapatılmayan bir öğenin, tırnaksız bir öznitelik değerinin ve hiçbir referans başlatmayan bir & karakterinin her birinin kendi cümlesi vardır. Hâlâ açık olan öğeyle eşleşmeyen bir kapatan etiket bunu söyler, ardından o öğenin gerektirdiği kapatan etiketi gösterir; bu etiket açık kalan öğenin adını taşır. Ayrıştırılamayan JSON da aynı biçimde, bunun ölçülebildiği her durumda ayrıştırıcısının durduğu satır ve sütunla birlikte reddedilir.

Yer veren bir cümlenin altında sayfa, hatalı karakteri vurgulanmış olarak kendi satırınızı gösterir; bu en çok, bütün belgenin tek bir satır olduğu küçültülmüş XML ya da JSON için önemlidir. Uzun bir satır vurgunun çevresindeki kısma indirilir ve kesildiği yere üç nokta konur. Hiçbir şey çizmeyen hatalı bir karakter, metnin sonu, bir sekme ya da bir bayt sırası işareti gibi, onun yerini tutan görünür bir simge üzerinde vurgulanır. Sütun, JavaScript’in bir dizeyi saydığı gibi UTF-16 kod birimleriyle sayar; bu yüzden vurgudan önceki bir emoji ya da nadir bir ideogram onu bir değil iki ilerletir.

Sitenin izin verdiğinden daha derine iç içe geçmiş bir belge de hangi yönde olursa olsun reddedilir ve cümlesi sınırı belirtir.

Sıkça sorulan sorular

Tek bir öğe neden dizi olarak yazılıyor?
Çünkü aynı yoldaki bir öğe belgenin başka bir yerinde aynı üst öğenin altında tekrarlanıyor ve yola bütün belge için bir kez karar veriliyor. Böylece değeri dizi olarak okuyan kod, tek öğeli olanlar da dahil her kayıtta çalışır. Sayfa yolu, bunun değiştirdiği ilk öğenin satırı ve sütunuyla birlikte adıyla anar. Örneğinizde yalnızca bir tane olduğu yerde dizi elde etmek için öğenin adını «Her zaman dizi» alanına yazın.
JSON’umda bir sayı neden tırnak içinde?
Çünkü aynı yoldaki bir değer baştaki bir sıfır, ondalık noktadan sonra sondaki bir sıfır, bir artı işareti ya da bir üs yüzünden sayı olarak sağ çıkamazdı; ya da o yolda sayılar ile mantıksal değerler buluşuyor. Böyle bir yol her yerde metindir ve sayfa onu adıyla anar. Değerleri, her biri sayının yeniden yazıldığı biçimde, yani 02134 değil 2134 olarak yazıldığında dönüşür.
Yorumlara, işleme yönergelerine ve DOCTYPE bildirimine ne olur?
JSON’a alınmazlar ve her çeşit, kaç tane olduğu ve ilkinin nerede durduğuyla birlikte duyurulur. DOCTYPE için verilen duyuru ayrıca DTD’nin uygulanmadığını söyler; bu yüzden onun bildirdiği hiçbir varsayılan öznitelik değeri yer almaz.
XML’imi bir DTD’ye ya da XSD’ye karşı denetler mi?
Hayır. İyi biçimli XML okur ve bir belgeyi nerede okuyamadığını söyler, ama bir DTD’ye ya da XSD’ye karşı doğrulama yapmaz ve bir DTD’nin bildirdiği hiçbir şeyi uygulamaz. Bir DOCTYPE bildiriminin sessizce yok sayılmak yerine uygulanmadı olarak duyurulmasının nedeni budur.
null XML’de nasıl yazılır ve geri gelir mi?
xsi:nil="true" taşıyan boş bir öğe olarak; XML Schema instance ad alanı kök öğesinde bir kez bildirilir. O XML’i geri dönüştürmek yeniden null verir; oysa düz boş bir öğe, metin olarak okunan her yolda boş bir dize olarak geri gelirdi. JSON’unuz xsi önekini zaten kendi adlarından biri için kullanıyorsa, sayfa bunun yerine boşta olan bir önek bildirir.
İçinde boşluk olan bir anahtara ne olur?
XML’in izin verdiği en yakın adla yazılır; böylece first name anahtarı first_name olur ve sayfa anahtarı, dönüştüğü adla birlikte JSONPath ifadesiyle anar. Yeniden yazmanın uygulandığı her değeri seçmek için o JSONPath ifadesini bu sitedeki JSONPath test aracına yapıştırın.
Geri dönüştürmek neden bana özgün XML’imi vermiyor?
Çünkü JSON’da bir XML dosyasının tuttuklarının bir kısmına yer yoktur: XML bildirimi, öğeler arasındaki biçimlendirme, yorumlar, işleme yönergeleri, DOCTYPE bildirimi ve karışık içeriğin sırası. Anlam taşıyanlar gidişte duyuruldu. Sabit kalan, sayfanın yazdığı XML’dir: onu aynı ayarlarla JSON’a götürüp yeniden geri getirin, aynı XML geri gelir.
Yapıştırdığım herhangi bir şey bir sunucuya gönderiliyor mu?
Hayır. İki yön de tümüyle tarayıcınızda çalışır; böylece yapıştırdığınız belge, ister bir API yanıtı, ister bir akış, ister içinde kimlik bilgileri bulunan bir yapılandırma dosyası olsun, cihazınızdan asla çıkmaz.

İlgili araçlar