Menü
Bedava
kayıt
ev  /  sorunlar/ İnternet Rehberi - tüm eğlence internette. XML Belge Nesne Modelini Kullanma Delphi xml dosyası nasıl oluşturulur

İnternet seyahat rehberi - tüm eğlence internette. XML Belge Nesne Modelini Kullanma Delphi xml dosyası nasıl oluşturulur

DELPHI'YE ÇÖZÜM SİPARİŞ VERİN
Delphi, öğrencilerin öğrenme sürecinde en sık karşılaştığı ikinci en önemli programlama dilidir. Bu, nesne yönelimli programlamayı öğrenmenin başlangıcıdır. Bir öğrenci olarak, bir dili öğrenmenin içine hesap makinesi yazmaktan daha kolay bir yöntem olmadığı sonucuna vardım. İki sayı ekleme gibi temel bir işlevi uygulasanız bile, birçok şeye ışık tutacaktır.

CodeGaear, Delphi 7, Lazarus farklı derleyiciler, yazdığınız kodu makineye aktaracak, birlere ve birlere dönüştürecek programlardır. Bunların hepsi ayrı programlama dilleri değil, program oluşturmaya yönelik programlardır. Bu derleyiciler, sözdizimi açısından sıradan Pascal'a benzeyen, ancak işlevsel olarak önemli ölçüde farklı olan Delphi dilinin temeli olan Object Pascal programlama dilini kullanır.

Bir programlama dilinin sözdizimi nedir?

Bu, çeşitli operatörleri yazmak için kullanılan formattır. Örneğin, bir Pascal for döngüsü şu biçime sahiptir: for n: = 1 ila k do vb.

C++ programlama dilinde aynı döngü biraz farklı yazılır: for (n = 1; n Bir hesap makinesi yazıyoruz

Bu size nesnelerin program koduyla nasıl etkileşime girdiğini, "değişkenlerin" ne olduğunu ve matematiksel işlevlerin nasıl çalıştığını anlamanızı sağlayacaktır. Herhangi bir programlama her durumda bir hesaplama olacaktır. Oyun aynı zamanda sürekli bir şeyler hesaplayan, sayılarla ve sayısal fonksiyonlarla çalışan bir programdır. Programlama matematikten ayrılamaz.

Yazmak için Lazarus geliştirme ortamını kullanalım. İşlevselliği, örneğin CodeGear kadar zengin değildir, ancak ücretsiz olarak kullanılabilir ve eğitim amaçlıdır.

Geliştirme ortamını açarak formu ve araç kutusunu görüyoruz. İşte form.

İşte araç kutusu.

Yapacağımız ilk şey, iki sayı eklemek için işlevi uygulamak için ihtiyacımız olan üç öğeyi eklemek. İhtiyacımız olan: "Tedit" üç parça ve "TBton". Aşağıdaki resimde panelde oklarla gösterilmiştir. Bir kez üzerlerine, ardından bir kez forma tıklıyoruz ve üzerinde görünüyorlar.

Bunlar, giriş için metin alanları ve normal bir düğmedir. Hemen hemen her şeyi kullanarak bu öğelere rastlarsınız. Windows programı... Bir göz at.


Şimdi bu etiketleri temizleyelim. "Görünüm" sekmesine tıklayın. Ve "Nesne Denetçisi. Bunun gibi bir pencere görünecektir.

Formdaki "Button" öğemize bir kez tıklıyoruz ve denetçi penceresindeki "Caption" değerini başka bir değere değiştiriyoruz. Örneğin, "Tamam" kelimesi. Enter'a basıyoruz. Öğenin adını nasıl değiştirdiğini formda görüyoruz.

Aynısını Edit'ler için de yapalım, isimlerini değiştirmeyin, içeriksiz yapın. Bunları sırayla seçin ve denetçideki Metin değerini temizleyin. Enter'a basmayı unutmayın.

Sonuç olarak formumuz bu şekilde.


Şimdi, hesap makinemizin çalışması için gerekli kayıtları kaydetmeniz gerekiyor. program kodu düğme prosedürümüz için. Düğme öğesine iki kez tıklayın ve kaynak düzenleyiciyi açın.

Görmek? Prosedür Düğme1Tıklayın. Düğmeye bir kez tıkladığımızda olanlardan sorumlu olan prosedür budur. Ve aşağıdakiler gerçekleşmelidir: program, üçüncü Düzenlemede ilk iki alana girilen sayıların toplamını göstermelidir. Kodu yazıyoruz.

Bu kadar basit 5 satırlık bir kod yazmamız gerekiyor. Yorumlar ve açıklamalar yukarıdaki resimde görülebilir. Daha sonra bu butona basıyoruz.

Projemiz derlenecek. Bir program haline getirilecek. İlk iki alana sayıları giriyoruz, butona tıklıyoruz ve toplamın değerini alıyoruz.

Çözüm

"Dosya" düğmesini, ardından "Tümünü Kaydet"i tıklayabilir, kaydetmek için bir klasör seçebilir ve masaüstünden başlatılabilen tam teşekküllü bir programa sahip olursunuz. Şimdi, programın iki sayıyı bölüp toplamaması için bu kodda neyi yeniden yazmanız gerektiğini kendiniz bulmaya çalışın. İpucu: veri türünü değiştirmeniz gerekir. Aşağıdaki video benzer bir örneği göstermektedir, ancak Delphi 7 ortamında Lazarus'ta değil.

Birçok Delphi programcısı için, ayarların kaydedilmesi, INI programlarındaki dosyalar. Başvuru Bu method, az çok ciddi projelerde, programın daha fazla genişletilmesini önleyen esnekliği sınırladığı için kaçınılmalıdır. Bu yaklaşımın, kullanım kolaylığı ve geliştirme ortamında yerleşik araçların bulunması nedeniyle oldukça popüler olduğu söylenmelidir.

Ancak yapılandırılmış XML Dosyalar. Avantajları, parametre sayısının sabitlenemeyebilmesidir. Bunu daha iyi anlamak için belirli bir örnek düşünün.

USearch programında, bir girdiye tıkladığınızda, bir öğe listesinin görüntülendiği bir bağlam menüsü belirir. Bu öğeler, sırayla ayarlar dosyasından yüklenen komutlardır. Ayarların saklanmış olması durumunda INI dosya, daha sonra program belirli sayıda komutu kaydedebilir ve yükleyebilir, örneğin 10 veya 50. Daha büyük bir değer gerektiğinde, kodu yeniden yazmanız ve buna göre yeniden derlemeniz gerekecektir.


kullanarak bir yaklaşım uygulamak XML dosyaları, tüm bölüm parametrelerini dinamik olarak yükleyebileceğiz. Ek olarak, konfigürasyon dosyası gereksiz parametre numaralandırması olmadan daha şık hale gelecektir. Fakat, standart araçlar birlikte çalışmak XML Delphi'nin birçok dezavantajı var, bu yüzden kullanmanızı tavsiye ederim standart kitaplık MSXML... Genellikle varsayılan olarak dahil edilir işletim sistemleri Windows ailesi.


Bağlanmak MSXML, COM sunucusundan içe aktararak tüm fonksiyonların bir listesini içeren bir arayüz dosyası oluşturmamız gerekiyor. Arayüzün nasıl içe aktarılacağı ile ilgili birçok detaylı yazı yazılmış ama dosyayı indirmenizi öneririm. MSXML2_TLB.PAS kullanıma hazır. Dosya indirildikten sonra projenizin yanına yerleştirin veya Delphi ortamının lib klasörüne bırakın. Böylece hepsi oluşturulan programlar modülü kullanabilecek MSXML, kullanımlara MSXML2_TLB satırını eklemeniz yeterlidir.

Netlik için, bu kitaplığı kullanmanın aşağıdaki örneğini göz önünde bulundurun:

Prosedür LoadData; var XMLDoc: DOMDocument; Kök: IXMLDOMElement; XMLDoc'u başlat: = CoDOMDocument.Create; XMLDoc.Load ("settings.xml"); Kök: = XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ("boyut / genişlik"). Metin); Kök: = sıfır; XMLDoc: = sıfır; son;

Önce DOMDocument sınıfının bir örneği oluşturulur ve ardından settings.xml dosyasının içeriği belleğe yüklenir. Standarda göre herhangi bir XML dosya kök etiketi içermelidir (bu durumda yapılandırma), o zaman işlevi kullanarak almamız gerekiyor Belge Öğesi... Ardından içerik, etiketler arasında görüntülenir. , sırayla etiketler arasında ... Böylece settings.xml dosyasından, yöntemimiz metni MessageBox'ta görüntüleyecektir. "100 piksel".

500 piksel 100 piksel

Burada parametre olarak bir dize alan SelectSingleNode yöntemi uygulanır.

Hoş geldin! Bu blog internet ve bilgisayarlarla ilgili daha doğrusu onlara ithaf edilmiştir.

Muhtemelen, sitede uzun yıllar boyunca yeni makalelerin görünmediği hemen açıktır. Evet, çoğu blogun kaderi bu. Bu proje bir zamanlar iddialı bir girişimdi ve yazar, o sırada yazan birçok kişi gibi, en iyi Rus blog yazarlarından biri olmak için iddialı planlara sahipti. Eh, şimdi bakarsanız, benimkiyle aynı anda oluşturulan blogların çoğu zaten sonsuzluğa kayboldu. Ve blog yazmak için yeterli zamanım yoktu. Yani evet, artık güncellenmiyor. Her ne kadar bir kez bu siteyle "Blog of Runet 2011" yarışmasını kazandık.

Tüm bunları silmek için bir fikrim bile vardı, ama sonra eski materyalleri gözden geçirdim ve okuyucular için hala yararlı olabileceğini fark ettim. Evet, bazı makaleler eskidir (yeterli gücüm varsa, uygun notlar alırlar), ancak örneğin site yeni başlayanlar için yararlı olabilir - burada okuyabilirsiniz temel konseptlerİnternet, İnternet'i nasıl yapılandıracağınızı öğrenin, Windows, hatta Linux'a geçmeye karar verin. Bu yüzden değerlendirme listelerine bakın ve sizin için doğru olanı seçin.

Yine de, umarım bu sadece bir blog olmaktan öte gerçek bir İnternet rehberidir. Site, mevcut tüm makalelerin kategoriye göre yapılandırıldığı dizin modunda görüntülenebilir. Ve kim bilir, belki bir gün burada yeni, yüksek kaliteli makaleler görünmeye başlar.

zımpara

Picodi.ru, tasarruf ve ucuz alışveriş konusunda Polonyalı bir uzman olan International Coupons'un bir indirim portalıdır. Polonyalılar dünyanın en ekonomik ülkelerinden biri olarak kabul edilir, bu nedenle bu tür bir projenin Polonyalı başlangıç ​​kodyrabatowe.pl'den çıkması şaşırtıcı değildir. Bu portal Rusya'daki sıradan bir İnternet kullanıcısı için nasıl faydalı olabilir?

Modern android telefonlar, telefonlardan daha fazlasıdır. yazmaya alışırsın yüklü programlar, arama ve kısa mesaj geçmişiniz, fotoğraf koleksiyonunuz ve daha fazlası için. Ancak zaman geçiyor ve size tamamen uyan cihaz, kasadaki yongalar veya ekrandaki çizikler nedeniyle yavaşlamaya, arızalanmaya veya sadece prezentabl görünümünü kaybetmeye başlıyor. Soru, yeni bir telefon seçme ve değiştirme konusunda ortaya çıkıyor. Android telefon... Ve şimdi seçim sorusunu atlarsak, o zaman "hareket etmek" yeni telefon ciddi bir sorun olmaya devam ediyor - kesinlikle tüm verileri sıfırdan başlatmak istemiyorsunuz. Bugün konuşacağımız şey bu.

Bu blogun okuyucularının çoğu, büyük olasılıkla, sürüm kontrol sistemleriyle hiç karşılaşmadı ve yakın gelecekte de karşılaşmayacak. Çok yazık. Bu son derece kullanışlı buluş, programcılar tarafından yaygın olarak kullanılmaktadır, ancak bence, metinlerle aktif olarak çalışanlar için çok yararlı olabilir. Ancak, muhtemelen, "ofis" için kullanmaya başlaması kolay olacak tek bir sürüm kontrol sistemi yoktur ( Microsoft Office) İş. Yine de, makalede sunulan materyalin tüm okuyucular için ilginç olabileceğini düşünüyorum.

Televizyonunuzdan ağdaki filmleri nasıl izleyeceğinizi ve internete nasıl gireceğinizi düşündüyseniz, bu makale tam size göre. Hayır, bazı TV'lerin zaten Smart TV işlevine sahip olduğunu biliyorum, ancak bunun düzgün çalıştığını hiç görmedim. Görünüşe göre, bu nedenle, son zamanlarda Google şirketi, hemen bir sansasyon haline gelen kesinlikle çarpıcı bir cihaz gösterdi. Geçen yılki feci Nexus Q'nun daha gelişmiş ve uygun fiyatlı bir sürümü olan Chromecast medya aktarıcısından (Chromcast) bahsediyoruz.

2 inçten daha küçük olan Dongle Chromcast, bağlantı noktasına takılır HDMI TV ve akışlı web içeriğini izlemenin keyfini çıkarmanızı sağlar. Yayıncıyı kontrol etmek için iOS, Windows, Android veya Mac OS işletim platformuna dayalı herhangi bir cihazı (tablet, PC, akıllı telefon) kullanabilirsiniz.

Bu makale, cihaz sistemi ile ilgili hafıza android, eksikliğinden kaynaklanabilecek sorunlar ve çözüm yolları. Çok uzun zaman önce, bir uygulama yüklemeye çalışırken android telefonumun yetersiz bellek hakkında düzenli olarak mesajlar vermeye başladığı gerçeğiyle karşı karşıya kaldım. Bu benim için çok garipti, piyasadaki açıklamaya göre yaklaşık 16GB olması gerekiyordu ve ben de bu hacmi ek bir hafıza kartı ile artırdım. Ancak, bir sorun vardı ve kök erişimi veya kök erişimi gerektirmeyen doğru çözümü bulmadan önce çok uğraşmam gerekti. Tam iyileşme telefon fabrika durumuna geri döndü.

Son zamanlarda, e-iş sistemlerinin veya aynı zamanda B2B (işletmeler arası) olarak da adlandırılan yapıların inşasına çok dikkat edildi. İnternet teknolojilerini koordine eden organın - WWW Konsorsiyumu'nun değişim akış sistemlerinin inşası için tavsiyeleri dikkate alarak: XML teknolojileri ve XML belgelerinin değiş tokuşuna yönelik sistemlerin inşası üzerinde durulmuştur.

XML kullanmanın avantajı elektronik Ticaret- yapılandırılmış bilgilerin açık ve görsel bir sunumu, modern kullanım yeteneği nedeniyle oluşturulması için düşük maliyetlerle B2B sistemlerinin yüksek verimliliği ağ protokolleri ve gerçek zamanlı iş sistemlerinin oluşturulması.

Formdaki bilgilerin sunumunun bağımsızlığı XML belgeleri e-iş ile uğraşan farklı şirketlerin birbirinden bağımsız yazılımlar üretmesine olanak tanır.

Tüm sistemlerde, değişim, kural olarak, HTTP istekleri kullanılarak aynı şemaya göre oluşturulur. Bilgi güvenliği protokolü olarak SSL protokolü kullanılmaktadır (ancak bu ayrı bir konudur).

Biri olası seçenekler XML mesaj işleme, XML belgelerini oluşturan veya işleyen BIN / CGI (ISAPI) uygulamalarının veya COM (sunucu) bileşenlerinin oluşturulmasıdır.

Uygulama bir yanda POST modunda HTTP isteği gönderen bir istemci görevi görür, diğer yanda isteğin işlendiği ve yanıtın verildiği bir WEB sunucusu vardır. Bilgi alışverişi XML belgelerini kullanır.

En verimli uygulama seçeneklerinden biri, DOM modelini destekleyen mevcut bir XML ayrıştırıcısını kullanmaktır. Böyle bir ayrıştırıcı, Win'98'in bir dağıtım dağıtımıdır veya parçası IE 4.7 ve üstü (Win`95 için) ve msxml.dll kitaplığında bulunan COM sunucusunu temsil eder.

Bileşen Nesne Modeli (COM) - kapsüllenmiş verileri ve yöntemleri tek bir varlıkta ve bunlara bir arabirim sistemi aracılığıyla erişmenin bir yolunu sunar. Delphi araçlarını kullanarak, bir COM nesnesinin sınıflarına erişmek oldukça kolaydır (bir COM sunucusuna birkaç sınıf dahil edilebilir). Nesnelere, arabirim sistemi aracılığıyla sınıfın bir örneğini başlatarak erişilir. Arayüzlerin tanımı, ortam aracılığıyla otomatik olarak gerçekleştirilebilen arayüz tanımlama dili (IDL) tarafından gerçekleştirilir.

Delphi araçları, bir COM sunucusundan içe aktarmak için kullanılır msxml.dll, IDL arabiriminin açıklaması için dosyalar ve kitaplık türlerinin ikili açıklaması için dosya - TLB oluşturulur. Bu operasyon sistem menüsü aracılığıyla gerçekleştirilir: Proje | Tür Kitaplığı İçe Aktarma:(resim 1). Ardından, bir COM nesnesi seçmeniz gereken (bizim durumumuzda nesne "Microsoft.XMLDom (Sürüm 2.0)" adı altında kayıtlıdır) ve bir TLB dosyası (düğmesi) oluşturmanız gereken bir iletişim kutusu görünür (Şekil 2) Birim Oluştur). TLB dosyasını kullanarak çerçeve bir Pascal COM sunucusu açıklama dosyası oluşturur - MSXML_TLB.pas

MSXML_TLB.pas dosyası, COM sunucusunun tüm arabirimlerini, sabitlerini ve ortak sınıflarını açıklar.

Bir COM öğesinin nesnelerine erişmek için yönergede KULLANIMLAR kitaplık açıklama dosyasının adını ekleyin (MSXML_TLB.pas). Aşağıda, bir XML belgesi yükleyen ve bunu bir Memo1 metin alanı öğesinde görüntüleyen standart DOM ayrıştırıcı msxml.dll'yi kullanan basit bir program bulunmaktadır.

kullanır Windows, Mesajlar, SysUtils, Sınıflar, Grafikler, Kontroller, Formlar, Diyaloglar, OleServer, MSXML_TLB, StdCtrls; tip TForm1 = sınıf(Form) Düğme1: T Düğme; Not1: TMemo; prosedür Button1Click (Gönderen: TObject); son; var Form1: TForm1; uygulama($ R * .DFM) prosedür TForm1.Button1Click (Gönderen: Tobject); // DOMDocument nesnesinin sosınıfının bildirimi; var coDoc: CoDOMDocument; // IDOMDocument arabirimiyle tutarlı sınıf; var Belge: IXMLDOMDocument; başlamak // DOMDocument nesnesinin bir örneğini oluşturun; Belge: = coDoc.Create; // DOMDocument nesnesinin bir örneğinin Load yöntemini çağırın; Doc.load ("veri.xml"); // DOMDocument örneğinin xml özelliğine erişin; Memo1.Text: = Doc.xml; son; son.

DOM Concept - Belge Nesne Modeli

Her bir XML belgesi, yardımıyla erişmenin mümkün olduğu birçok nesne (sınıf) kümesi olarak temsil edilir. bireysel elemanlar(nesne alanları). DOM - arabirim, hem DOMString veya CharacterData türündeki basit nesnelere hem de parçalara veya ayrı parçalara erişimi açıklar. XML öğeleri belge: DOMFragmentElement, DOMNode, DOMElement.

XMLDOMDocument, XMLDOMNode, XMLDOMNodeList nesnelerinin en önemli özellikleri ve yöntemleri aşağıdadır. Aşağıda sunulan DOM nesnelerinin (Belge Nesne Modeli) yöntemlerinin ve işlevlerinin, Microsoft XML ayrıştırıcı msxml.dll tarafından kullanıldığı ve W3C DOM Konsorsiyumu tarafından onaylanan modelden biraz daha geniş olduğu belirtilmelidir.

Daha Tam tanım DOM nesneleri arayüzü şu adreste bulunabilir:

XMLDOMDoment nesnesi
Nesne hiyerarşisinin en üst düzeyini temsil eder ve bir belgeyle çalışma yöntemlerini içerir: belgeyi yükleme, analiz etme, öğeler, nitelikler, yorumlar oluşturma, vb. ...
Özellikler
zaman uyumsuz Geçerli işleme modunu tanımlayan özellik
Ayrıştırma hatası XMLDOMParseError hata işleme nesnesine bir başvuru döndürür
Etkinleştir - belge doğrulamasını devre dışı bırakın.
url Belgenin URL'sini döndürür
belge elemanı Belgenin kök öğesine bir XMLDOMElement nesnesi olarak bir başvuru içerir.
yöntemler
yükle (url)
loadXML (xmlString)
Bir XML belgesi yükler,
kaydet (objTarget) XML belgesini dosyaya kaydeder
iptal etmek Belgeyi yükleme ve işleme sürecinin kesintiye uğraması.
createAttribute (isim) Geçerli öğe için belirtilen adla yeni bir öznitelik oluşturur.
createNode (Tür, ad, nameSpaceURI) Belirtilen türde ve adda bir düğüm oluşturur
createElement (etiketAdı) Belirtilen ada sahip bir belge öğesi oluşturur.
createTextNode (veri) Bir belge içinde metin oluşturur
getElementsByTagName (etiket adı) Verilen ada sahip belge öğeleri koleksiyonuna bir başvuru döndürür
nodeFromID (idString) Kimliğe göre bir öğe bulma

XMLDOMNode nesnesi
Temel DOM arabirimini uygulayan XMLDOMNode nesnesi düğüm, belge ağacının ayrı bir düğümünü işlemek için tasarlanmıştır. Özellikleri ve yöntemleri, mevcut düğüm hakkında tam bilgi almanıza ve değiştirmenize izin verir - türü, adı, tam adı, içeriği, alt öğelerin listesi vb.
Özellikler
düğümAdı, temelAdı Geçerli düğümün adını döndürür.
önek Ad Alanı önekini döndürür.
veri tipi Geçerli düğümün içerik türünü belirtir
nodeType, nodeTypeString Geçerli düğümün türünü döndürür:
Öznitellikler Geçerli düğümün özniteliklerinin bir listesini bir XMLDOMNamedNodeMap koleksiyonu olarak alır.
Metin Geçerli alt ağacın içeriğini metin olarak döndürür
xml Geçerli alt ağacın bir XML temsilini döndürür.
düğümDeğeri Geçerli düğümün içeriğini döndürür.
alt düğümler Alt öğelerin listesini XMLDOMNodeList olarak döndürür.
ilk Çocuk, son Çocuk İlk / son çocuğu döndürür
öncekiKardeş, sonrakiKardeş Önceki / sonraki kardeş öğeyi döndürür.
ebeveyn Düğümü Ana öğeye bir bağlantı içerir.
sahibiBelge Geçerli düğümü içeren belgeye bir işaretçi döndürür.
yöntemler
appendChild (newChild) Geçerli düğüme yeni bir alt öğe ekler.
insertBefore (newChild, refChild) refChild parametresi tarafından belirtilen düğümün "soldaki" geçerli alt ağacında konumlandırarak bir alt düğüm ekler.
klonNode (derin) Geçerli öğenin bir kopyasını oluşturur.
getAttribute(isim)
getAttributeNode(isim)
setAttribute (ad, değer)
setAttributeNode (XMLDOMAttribute)
Nesnenin niteliklerine (oluşturma, okuma, yazma) erişim. Ad, niteliğin adıdır, değer ise değeridir. Bir XMLDOMAttribute nesnesinin değerini döndürür.
replaceChild (newChild, oldChild) removeChild (oldChild) Geçerli alt nesneler listesinin oldChild nesnesini newChild ile değiştirmek. oldChild nesnesi siliniyor
selectNodes (patternString) selectSingleNode (patternString) İadeler XMLDOMNodeList nesnesi, arama düzenine veya ilk düğüme göre seçilir
transformNode (stil sayfası)
transformNodeToObject (stil sayfası, outputObject)
Geçerli düğümün alt ağacına bir stil sayfası atar ve işlemin sonucunu temsil eden bir dize döndürür. Parametre, XSL deyimlerini içeren DOMDocument nesnesine bir başvurudur.

İş Dünyasında XML Kullanımı.

Daha net bir resim için bir açıklamaya ihtiyaç var ve nasıl çalıştığını anlamak için tüm bunlara neden ihtiyaç duyuluyor:

Bir B2B veya kurumsal ERP sistemi oluştururken, pr-I'nin işletmeleri veya şubeleri arasında XML belgelerinin bilgi alışverişini düzenlerken, HTTP protokolleri üzerinden mevcut WEB sunucularına dayanan verimli bir şekilde kanıtlanmış bir bilgi aktarımı sistemi kullanılır.

Uygulama bir yanda POST modunda HTTP isteği gönderen bir istemci görevi görür, diğer yanda isteğin işlendiği ve yanıtın verildiği bir WEB sunucusu vardır. XML belgeleri bir değişim olarak kullanılır.

Örneğin basit bir kurumsal ERP sisteminde, bir muhasebe programında (ACS Muhasebe), fatura talebi oluşturularak antreposu olan bir şubeye (ACS Warehouse) gönderilmesi gerekir. AWP Bir B2B sistemi oluştururken, A Şirketi Tedarikçi B'den ürünlerin kullanılabilirliğini istediğinde (satın alma için sipariş verdiğinde) benzer bir sorun bildirimi.

Enterprise A ve programı bir müşteri olarak hareket eder. Depoya, bir SQL sunucusunda bir veri tabanına sahip bir depo kompleksine sahip olan Tedarikçi B tarafından hizmet verilmektedir. Değişim, Tedarikçi V'nin kurumsal WEB sunucusu aracılığıyla gerçekleştirilir.

Aşağıdaki tipik değişim algoritması aşağıdadır:


Figür 3.
  1. Kurumsal A başlatır süreç A(ürün siparişi), bir WEB istemcisi gibi davranır.
  2. İşlem A bir XML belgesi (örneğin, bir fatura talebi) oluşturur ve bunu bir POST http talebi olarak Sağlayıcı B'nin WEB sunucusuna iletir. Bir URI olarak, işleme uygulamasının kaynak tanımlayıcısı kullanılır. URI, tüm belge türleri için aynı veya her tür için ayrı olabilir. Her şey B2B (WEB) sunucusunun yapısına bağlıdır.
  3. WEB sunucusu isteği analiz eder ve bir sunucu oluşturur Süreç B XML belgesinin gövdesini parametre olarak geçirerek.
    B Süreci, WEB sunucusu tarafından başlatılır ve bir ASP sayfası, CGI (ISAPI) - uygulama veya JAVA sunucusu (sunucu uygulaması) olarak işlenir.
  4. Süreç B- SQL veritabanı sunucusuna bir istek oluşturur.
  5. SQL sunucusu, veritabanında gerekli işlemleri gerçekleştirir, bir yanıt oluşturur ve geri döndürür. Süreç B.
  6. SQL sunucusundan gelen cevaba göre Süreç B bir XML belgesi (yanıt) oluşturur ve bunu istemci uygulamasına bir http isteğine yanıt olarak döndürür.
  7. Ayrıca client tarafında duruma göre ya yeni bir http request oluşturulur ya da session sonlandırılır.

Belge akışının organizasyonu hakkında birkaç söz.

XML belgelerini değiş tokuş etmek için bir sistem geliştirmenin genel kuralı şudur:

  • Başta- elektronik belgelerin akış şemasının ve yapılarının geliştirilmesi;
  • ikinci olarak- süreç fonksiyonları (alt süreçler) tablolarının geliştirilmesi, yani. her işlemin hangi XML belgesine göre hangi işlevi uygulayacağı.

Her XML belgesi, bir HTML belgesi gibi, bir mesaj başlığından (etiketlerle çevrelenen bilgiler) ve bir mesaj gövdesinden (bir istek için, bu bilgiler bir isteğe yanıt vermek için etiketlerle çerçevelenir) oluşmalıdır. XML belgesinin iyi biçimlenebilmesi için, örneğin "Başlık" ve "Talep" adlı iki bileşen parçasının etiketlerle çerçevelenmesi gerekir. Tipik bir belgenin türü aşağıda sunulmuştur:

Başlık (Şekil 4), bir HTML belgesinin aksine, iletilen belgenin türü ve işleme süreci hakkında bilgiler dahil olmak üzere çeşitli hizmet bilgilerini içermelidir. Belgenin gövdesi bilgi işlemeye girer, yani. etiketlerle çerçevelenmiş içerik. Başlıkların yapısının her tür belge için aynı olması gerektiğine dikkat edilmelidir.

Sunucu tarafından başlatılan İşlem için, işleme algoritmasını aşağıdaki gibi oluşturmak tercih edilir (ancak gerekli değildir):


Şekil 6.

İstemci tarafını oluştururken bazı temel noktalar

Daha önce açıklandığı gibi, bir XML belgesi oluştururken, bunun bir DOM modeli biçimindeki temsili kullanılır. Aşağıda, bir mesaj xml başlığı oluşturma programının bir Delphi metin bölümü örneği verilmiştir.

prosedür TThread1.HeaderCreate (Gönderen: Tobject); var // sınıf bildirimi, oluşturmak için gerekli coDoc: CoDomDocument; // XMLDomDocument nesnesi Belge: Belge Belgesi; r: IXMLDOME öğesi; Düğüm: IXMLDOME öğesi; // DOMText txt: IXMLDOMText; // DOMAttribute özniteliği: IXMLDOMAttribute; başlamak // DOM belgesi oluştur Belge: = coDoc.Create; Doc.Set_async (yanlış); // DOM belgesinin ilk başlatılması Doc.LoadXML ("
"); // DOME öğesi oluştur (etiket<Gönderen>) Düğüm: = Doc.createElement ("Gönderen"); // bir metin düğümü oluştur " Tayfun LLC" txt: = Doc.createTextNode ("Typhoon LLC"); // düğüme atama<Gönderen> değer // metin düğümü " Tayfun LLC" Node.appendChild (txt); // eleman ekle<Gönderen> çocukken belge köküne r.appendChild (Düğüm); <İtibaren> Düğüm: = Doc.createElement ("Kimden"); txt: = Doc.createTextNode ("http://tayfun.ru/xml/default.asp"); Node.appendChild (txt); r.appendChild (Düğüm); // etiket için benzer işlemler<NS> Düğüm: = Doc.createElement ("Kime"); txt: = Doc.createTextNode ("http://irbis.ru"); Node.appendChild (txt); r.appendChild (Düğüm); // DOME öğesi oluştur () Düğüm: = Doc.createElement ("TypeDocument"); // XMLDOMAttribute düğümü oluştur Att: = Doc.createAttribute ("Id", "Sipariş"); // Node.appendChild (Att); r.appendChild (Düğüm); son;

Unutulmamalıdır ki coDoc: CoDomDocument ve Doc: DomDocument değişkeninin bildirimi ve Create yöntemiyle (Doc: = coDoc.Create;) oluşturulması bir kez yapılır. Değişken bildirimi, bu örnekte netlik için gösterildiği gibi (yani, bir program modülü başına DomDocument türünün bir global değişkeni) yerel prosedürde değil, genel değişkenleri açıklayan bölümde bulunur.

Yukarıdaki programın çalışmasının sonucu, örnek xml belgemize uygulanan oluşturulan başlık olacaktır: Şekil 5'te gösterilmiştir.


Şekil 5.


Şekil 6.

XML belgeleri biçiminde bilgi aktarmanın temel avantajı, DBMS'de hem alıcı hem de iletilen tarafta bağımsız tablo yapıları kullanarak bir mesaj oluşturmanın mümkün olmasıdır. Örneğimizi kullanarak, Şekil 6'da gösterilen yapıya sahip DBMS'den Enterprise A'nın faturalarıyla ilgili bilgilerin aktarılması gerektiğini varsayalım.

Bir fatura içeren bir xml belgesi oluşturmak için, başlangıçta faturanın kendisiyle ilgili bilgilerle bir SQL sorgusu (sorgu A) oluşturulur:

SEÇME* Fatura_Genel'den NEREDE FaturaNum =: num SEÇME Mal, Kalite, Fiyat, HZ_cod İTİBAREN Mal NEREDE FaturaNum =: num //: num, fatura numarasını belirten bir parametredir.

Aşağıda, xml belgesinin gövdesini oluşturan programın bir bölümü bulunmaktadır:

prosedür TThread1.DataBodyCreate (Gönderen: Tobject); var // sınıfın ve XMLDomDocument nesnesinin bildirimi// coDoc: CoDomDocument; // tüm modül için global olmalıdır.// Belge: Belge Belgesi; // DOMElement nesnelerini bildir r: IXMLDOME öğesi; // DOMEeleman; Düğüm, Düğüm2: IXMLDOME öğesi; Düğüm3, Düğüm4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: dize; // Fatura numarası: tamsayı;- global değişken - // 987654 değerine sahip // sorguA, sorguB: Sicim;- global değişken, // sorguya karşılık gelen bir değere sahiptir // sorguA - fatura hakkında genel bilgi içeren A sorgusu // sorguB - faturada açıklanan mallar hakkında sorgu B bilgisi (metne bakınız) başlamak Sorgu.Kapat; // "request A" metnine bakın Query.Text: = sorguA; // isteği yürüt Query.ExecSQL; Sorgu.Aç; // kök elemanın adresini al r: = Doc.Get_documentElement; Düğüm2: = Doc.createElement ("İstek"); // DOME öğesi (etiket) oluştur Düğüm: = Doc.createElement ("Fatura"); // köke bir eleman ekle r.appendChild (Düğüm2); // bir öğe ekle Düğüm2. appendChild (Düğüm); // DOME öğesi (etiket) oluştur Düğüm3: = Doc.createElement ("Ayrılma"); // bir öğe ekle Düğüm. appendChild (Düğüm3); // isteğin "Depurture" alanına çağrı str: = Query.FieldByName ("Ayrılma").AsString; // metin düğümü oluştur = alan değeri// düğüme bir değer ata // metin düğümü, değişken str Node.appendChild (txt); // etiket için benzer işlemler , , // , // (DB alanı "Alıcı") Düğüm: = Doc.createElement ("Hedef"); // veritabanı alanının adı, adla aynı olmayabilir str: = Query.FieldByName ("Alıcı") .AsString; // etiketi, kullanmanın avantajı budur txt: = Doc.createTextNode (str); // XML arabirimini destekleyen bir DBMS'nin önündeki arabirimin DOM'si, // ORACLE 8i veya Ms SQL 2000 gibi Node.appendChild (txt); ... // mallar için bir spesifikasyon talebi oluşturma // erişim isteğini kapat Sorgu.Kapat; // "request B" metnine bakın, bilgi. mallar hakkında Query.Text: = sorguВ; // parametre değerlerinin atanması Query.Params.AsInteger: = FaturaNumarası; // isteği yürüt Query2.ExecSQL; // istek verilerine açık erişim Sorgu.Aç; // DOME öğesi (etiket) oluştur Düğüm3: = Doc.createElement ("Imemler"); // bir öğe ekle Düğüm. appendChild (Düğüm3); // sorgunun tüm satırları arasında dolaş süre Olumsuz Eof.Sorgu yapmak start Node4: = Doc.createElement ("Imem"); // bir öğe ekle Node3.appendChild (Düğüm4); // etiket için veri oluşturma str: = Query.FieldByName ("Fiyat").AsString; txt: = Doc.createTextNode (str); Node.appendChild (txt); ... // etiketler için benzer işlemler , , son; son;

Bu prosedürün bir sonucu olarak, bir XML belgesinin aşağıdaki metni oluşturulur:


Bir istek oluşturmak için nesnenin Open yöntemi kullanılır. IXMLHttpRequest:

prosedür Aç (const bstrMethod, - yöntem türü = "POST" bstrUrl, - Sunucu url'si varAsync, - eşzamansız / eşzamanlı iletişim modu = true bstrUser, - kimlik doğrulaması için kullanıcı adı bstrPassword) - parola

Belge işlemenin sunucu tarafını oluşturma

Daha önce belirtildiği gibi, işleme HTTP isteği CGI uygulamaları veya Java sunucu uygulamaları tarafından uygulanabilir. ASP sayfaları yazma varyantı da mümkündür. Ancak bu durumda, sorgu dizesi üzerinden yalnızca "GET" yöntemiyle veri aktarımı mümkündür. Ancak, ASP sayfaları için bir HTTP isteğini işlemek, bir CGI uygulamasından daha verimlidir. Bununla birlikte, bence, nasıl işleneceği önemli değil, ancak soruyu çözmek daha önemlidir - bir işleme programının nasıl oluşturulacağı ve hangi yollarla değil.

Önceki bölümden bir XML belgesi oluşturma seçeneklerini incelediysek, sunucu uygulamasının görevi tam tersi - XML ​​belgelerini ayrıştırmaktır. Aşağıda, bir xml belgesini ayrıştıran programın bir kısmı verilmiştir:

prosedür Tthread1.DataParser (Gönderen: Tobject); var // DOMElement nesnelerini bildir r, FNode: IXMLDOMElement; Str, Dosya Adı: Dize; parm: Dize; // soclass bildirimi ve CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; // XMLDomDocument nesnesi XMLDoc, XSLDoc, ResultDoc: DomDocument; // HttpStr: Dize; - HTTP istek dizesini içeren global bir değişken Başlamak XMLDoc: = coDocXML.Create; XMLDoc.LoadXML (HttpStr); // kök elemanın adresini al r: = Doc.Get_documentElement; // elemanın değerini al FNode: = r.SelectSingleNode ("// TypeDocument"); // id özniteliğinin değerini al = "Sipariş" DosyaAdı: = FNode.GetAttibute ("id"); // ve Order.xsl dosya adını oluşturuyoruz DosyaAdı: = DosyaAdı + ".Xsl"; // XSLDoc belgesi oluştur XSLDoc: = coDocXSL.Create; XSLDoc.LoadXML (DosyaAdı); // XMLDoc belgesi oluştur ResultDoc: = coDocResult.Create; // senkron işleme modunu ayarla ResultDoc.Set_async (yanlış); // ayrıştırma kontrolünü ayarla ResultDoc.validateOnParse: = true; // XSL şablonunu kullanarak XMLDoc'u ayrıştırma XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); // Str değişkenine bir metin değeri atanır // ortaya çıkan belgenin. Str: = ResultDoc.text; // bir eleman bul FNode: = r.SelectSingleNode ("// FaturaNumarası"); // ve elemanın değerini alın parm: = FNode.text; // erişim isteğini kapat Sorgu.Kapat; Query.Text: = Str; // parametre değerinin atanması Query.Params.AsString: = parm; // isteği yürüt Query.ExecSQL; son;

Ayrıştırmanın en önemli özelliği, her belge türü için ayrı ayrı oluşturulan bir XSL şablonunun kullanılmasıdır. Ayrıştırmanın sonucu bir SQL sorgu dizesidir. Ardından, oluşturulan SQL sorgu dizesinin yürütülmesi, VTYS'deki verilerde gerekli değişiklikleri yapacaktır.

Bir şablon aracılığıyla ayrıştırmanın kullanılmasının avantajı, aynı zamanda bir miktar veri esnekliğinin elde edilmesi ve algoritmanın program kodundan tam bağımsızlığının elde edilmesidir. Bir SİPARİŞ belgesini işlemek için kullanılan XSL şablonunun metni aşağıdadır:

TABREG'E INSERT (FROM, TO, TYPEDOC, body) DEĞERLERİ (" ", "", "") MALLARINA EKLE (faturaNumarası, adı, fiyatı, kalitesi) DEĞERLER (": sayı", " ", "", " ")

Yukarıdaki örneği açıklarken, bir çift etiket kullanımının doğası gereği resmi olduğuna dikkat edilmelidir, çünkü ayrıştırmadan sonra, ortaya çıkan XML belgesi resmi olarak en az bir düğüm içermelidir. ResultDoc.text yöntemi, XML belgesinin ayrıştırılması sırasında elde edilen ResultDoc'un metin değerini atar. Bu durumda değer, bir çift etiket tarafından çerçevelenen her şeydir ve yani. Oluşturduğumuz SQL sorgusu.

Program yazmanın bir başka özelliği de SQL parametresini kullanma olasılığına dikkat edilmelidir. : sayı. Parametreyi kullanmak, xsl şablonunun metnini basitleştirir. XML belgesinin düğümlerinin karşılık gelen öğelerinin değerinin tanımı, başlangıçta ilgili düğümün adıyla yapılan seçimle belirlenir, örneğin:

Bir bakışta XSL

XSL kısaltması, bir stil sayfası biçimlendirme dili (XML verileri) olan eXtensible Stylesheet Language'den gelir. Başlıktan da görebileceğiniz gibi, XML verilerini biçimlendirmek için eXtensible Stylesheet Language (XSL) kullanılır. Tanım olarak, W3C XSL iki bölümden oluşur:

  • XSLT - XSL Dönüşümü. XML belgelerini dönüştürmek veya biçimlendirmek (dönüştürmek) için kullanılan dil. Böylece, XSLT'nin yardımıyla, bir dizi verinin farklı kesimlerini ve veri sunum biçimlerini elde edebiliriz.
  • Biçimlendirme öğeleri. Bu öğeler, XSL ile işlendikten sonra verilerin tüm tipografik öğelerini içerir. Sadece şekillendirmek için kullanılır HTML sayfaları.

XSLT yardımıyla bir XML dosyasından ihtiyacımız olan verileri seçip, kullanıcıya sunum için bir formda düzenleyebiliyoruz. Örneğin, bizim durumumuzda XML verilerini şu şekilde dönüştürdük: SQL sorgusu... XSL'nin klasik kullanımı genellikle verileri HTML sayfaları biçiminde veya daha nadiren RTF dosyaları biçiminde biçimlendirmektir.

XSL dosyası, XML verilerinin dönüştürülmesinin gerçekleştirileceği bir şablonu tanımlar. xsl şablonlarına dönersek, aşağıdaki öğeler (yönergeler) XSLT'de ayırt edilebilir:

XSL direktifleri tanım
xsl: uygulama şablonları Select özniteliği = "şablon adı" için eşleşen şablonların kullanımını gösteren bir yönerge
xsl: nitelik bir öznitelik ağacı oluşturur ve onu çıktı öğesine ekler, parametre adı = "öznitelik adı", ad alanı ad alanı URI'sidir (ad alanı öneki)
xsl: çağrı şablonu bir şablonu çağırır, öznitelik adı = "Şablon için URI"
xsl: seç
xsl: ne zaman
xsl: aksi halde
xsl koşuluna göre seçim: ifade = "komut dosyasındaki ifadenin değerlendirilmesi" olduğunda,
dil = "dil-adı"
test = "değerlendirilmiş ifade"
xsl: yorum çıktı belgesinde bir yorum oluşturur
xsl: kopyala
xsl: kopyası
geçerli düğümü çıktı kaynağına kopyalar veya bir düğüme bir belge parçası ekler, burada select özniteliği = "kaynak düğüm adı"
xsl: eleman ada göre bir çıktı öğesi oluşturur, öznitelik adı = "öğe adı", ad alanı = "uri ad alanı referansı"
xsl: her biri için şablonu düğüm listesinin tüm düğümlerine yeniden uygular, select niteliği düğümlerin listesini belirtir
xsl: eğer test özelliği tarafından bir ifade olarak ayarlanan koşul kontrolü
xsl: dahil harici şablon içerir, öznitelik href = "URI referansı"
xsl: çıktı çıktıyı belirtir, yöntem niteliği "xml", "html" veya "text" olabilir
xsl: parametre parametrelerin değerini belirtir, öznitelik adı = "parametre adı", seç = "değer"
xsl: işleme talimatı bir işleme talimatı oluşturur, nitelik adı = "talimat sürecinin adı"
xsl: sıralama düğüm kümesini sıralar, nitelikler select = "düğüm adı", veri türü = veri türü ("metin" | "sayı" | Qname), düzen = sıralama yönü ("artan" | "azalan")
xsl: stil sayfası bir xsl şablon belgesini tanımlar, XSLT için kök öğedir
xsl: şablon bir xsl şablonu tanımlar, öznitelik adı = "şablon adının URI öneki", eşleşme = "şablonun uygulandığı düğümün bir göstergesi"
xsl: metin çıktı akışına metin oluşturur, disable-output-escaping = "yes" veya "no" özniteliği, ESC karakterleri oluşturma yeteneğini gösterir
xsl: değer-of seçilen düğümün değerini metin olarak ekler, öznitelik seçimi = değerin alındığı "noda işaretçisi"
xsl: değişken değişken sınırlarının değerini belirtir, öznitelik adı = "değişken adı", select = "değişken değerinin hesaplanması"
xsl: parametreli parametreyi şablona uygular, öznitelik adı = "parametre adı", geçerli bağlamı değerlendirmek için = ifadeyi seçin, varsayılan değer "."

Çözüm

Son olarak, standart XML ayrıştırıcısının kullanılmasının msxml.dll XML belgelerini ayrıştırmak ve oluşturmak için tek araç değildir. Örneğin, XML belgeleri oluşturmak için bileşenleri etkin bir şekilde kullanın. TPageProduser ve TabloÜretici... Ancak bu makale yalnızca DOM modelinin pratikte genişliğini ve uygulanabilirliğini vurgulamaktadır.

Yazar, konunun uygunluğu, genel içerik, sunum tarzı ve ayrıca bir makale koleksiyonu yazmanın kalitesini ve konuyu kapsayan bir kitabın yayınlanmasının kalitesini daha da artırmaya yardımcı olacak diğer tüm yorumlar hakkında geri bildirim için çok minnettar olacaktır. e-ticarette XML belgelerini kullanmanın pratik tarafı. Daha detaylı bilgi elektronik belgelerin kullanımının pratik tarafı hakkında yazarın sitesinde bulunabilir www.eDocs.al.ru Ayrıca yazarın sitesinde kaynak metinlerin ve örneklerin yerleştirilmesi planlanmaktadır.

XML, bilgileri depolamak ve uygulamalar ile Web siteleri arasında değiş tokuş etmek için giderek daha fazla kullanılmaktadır. Birçok uygulama bu dili veri depolamak için temel dil olarak kullanırken, diğerleri bunu XML verilerini dışa ve içe aktarmak için kullanır. Bu nedenle, geliştiricilerin XML verilerinin kendi uygulamalarında nasıl kullanılabileceğini düşünmeye başlamalarının zamanı geldi.

Bu yazıda, XML Belge Nesne Modeli (DOM) ve Microsoft'un XML DOM uygulamasını inceleyeceğiz.

XML DOM, bir geliştiriciye XML dosyalarını yüklemek ve işlemek için nesneler sağlayan bir nesne modelidir. Nesne modeli şu temel nesnelerden oluşur: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap ve XMLDOMParseError. Bu nesnelerin her biri (XMLDOMParseError hariç), nesne hakkında bilgi almanıza, nesnenin değerlerini ve yapısını değiştirmenize ve bir XML belgesinin yapısında gezinmenize izin veren özellikler ve yöntemler içerir.

Ana XML DOM nesnelerine bakalım ve bunların Borland Delphi'deki kullanımlarına ilişkin bazı örnekler gösterelim.

Borland Delphi'de XML DOM Kullanımı

Delphi uygulamalarında Microsoft XML DOM kullanmak için projeye uygun tip kütüphanesini bağlamanız gerekmektedir. Bunu yapmak için Project | Tip Kitaplığını Al ve Tip Kitaplığını Al iletişim kutusunda, genellikle Windows \ System \ MSXML.DLL dosyasında bulunan Microsoft XML sürüm 2.0 (Sürüm 2.0) kitaplığını seçin.

Birim Oluştur düğmesine tıkladıktan sonra, XML DOM nesnelerini kullanmamıza izin verecek olan MSXML_TLB arabirim modülü oluşturulacaktır: DOMDocument, XMLDocument, XMLHTTPRequest ve MSXML.DLL kitaplığında uygulanan diğerleri. MSXML_TLB modülüne yapılan başvuru Kullanımlar listesinde olmalıdır.

XML DOM cihazı

Belge Nesne Modeli, dallardan oluşan bir ağaç yapısında bir XML belgesini temsil eder. XML DOM API'leri, uygulamaların belge ağacında gezinmesine ve dallarını değiştirmesine olanak tanır. Her dal, ana ve alt dalların belirlendiği belirli bir türe (DOMNodeType) sahip olabilir. Çoğu XML belgesi, tür öğesi, nitelik ve metin dalları içerir. Nitelikler özel bir dal türüdür ve alt dallar değildir. Öznitelikleri değiştirmek için XML DOM nesneleri tarafından sağlanan özel yöntemler kullanılır.

Microsoft XML DOM, World Wide Web Consortium (W3C) tarafından önerilen arabirimleri uygulamaya ek olarak, XSL, XSL Modelleri, Ad Alanları ve veri türlerini destekleyen yöntemler içerir. Örneğin, SelectNodes yöntemi, belirli bir bağlamda dalları bulmak için XSL Model Sözdizimini kullanmanıza izin verir ve TransformNode yöntemi, dönüşümleri gerçekleştirmek için XSL kullanımını destekler.

XML Belgesini Test Et

Örnek bir XML belgesi olarak, aşağıdaki yapıya sahip bir müzik CD-ROM dizinini ele alalım:

imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985 kalbini sakla bonnie tylor Birleşik Krallık CBS Kayıtları 9.90 1988 ... Kalbimi özgür bırak Joe cocker Amerika Birleşik Devletleri EMI 8.20 1987

Artık XMLDOMDocument nesnesinden başlayarak XML DOM nesne modeline bakmaya hazırız.

XML Belgesi - XMLDOMDocument Nesnesi

Bir XML belgesiyle çalışmak, onu yüklemekle başlar. Bunu yapmak için, yüklenen belgenin URL'sini belirten yalnızca bir parametreye sahip olan Load yöntemini kullanıyoruz. Dosyaları yerel bir diskten yüklerken, yalnızca tam dosya adı belirtilir (bu durumda dosya: /// protokolü atlanabilir). XML belgesi bir dize olarak saklanıyorsa, belgeyi yüklemek için LoadXML yöntemini kullanın.

Async özelliği, belgenin nasıl yüklendiğini (eşzamanlı veya eşzamansız) kontrol etmek için kullanılır. Varsayılan olarak bu özellik, belgenin eşzamansız olarak yüklendiğini ve belge tamamen yüklenmeden önce kontrolün uygulamaya döndürüldüğünü belirten True olarak ayarlanır. Aksi takdirde, belge eşzamanlı olarak yüklenir ve ardından belgenin yüklenip yüklenmediğini görmek için ReadyState özelliğinin değerini kontrol etmeniz gerekir. Ayrıca, ReadyState özelliğinin değeri değiştiğinde denetimi devralacak OnReadyStateChange olayı için bir olay işleyicisi de oluşturabilirsiniz.

Aşağıdakiler, Load yöntemi kullanılarak bir XML belgesinin nasıl yükleneceğini gösterir:

Kullanır ... MSXML_TLB ... prosedürü TForm1.Button1Click (Gönderen: TObject); var XMLDoc: IXMLDOMDocument; XMLDoc'u başlat: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // // XML belgesini ve dallarını yöneten kodun // XMLDoc: = Nil; son;

Belge yüklendikten sonra özelliklerine erişebiliriz. Böylece, NodeName özelliği #document değerini içerecek, NodeTypeString özelliği belge değerini içerecek ve URL özelliği şu dosyayı içerecek: /// C: /DATA/DATA.xml değeri.

Hata yönetimi

Özellikle ilgi çekici olan, yükleme üzerine belge işleme ile ilgili özelliklerdir. Örneğin, ParseError özelliği, belge işlenirken oluşan bir hata hakkında bilgi içeren bir XMLDOMParseError nesnesi döndürür.

Bir hata işleyicisi yazmak için aşağıdaki kodu ekleyebilirsiniz:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ('C: \ DATA \ DATA.xml'); XMLError: = XMLDoc.ParseError; XMLError.ErrorCode ise<>0 Sonra // // Burada hatayı işliyoruz // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;

Bir hata durumunda hangi bilgilerin döndürüldüğünü öğrenmek için aşağıdaki dizin girişini değiştirin:

imparatorluk burlesk Bob Dylan Amerika Birleşik Devletleri Kolombiya 10.90 1985

kapatma elemanının çıkarılması ikinci satırda:</p><p> <CD> <TITLE>imparatorluk burlesk <ARTIST>Bob Dylan</ARTIST> <COUNTRY>Amerika Birleşik Devletleri</COUNTRY> <COMPANY>Kolombiya</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Şimdi XMLDOMParseError nesnesinin özellik değerlerini döndüren bir kod yazalım:</p><p>XMLError: = XMLDoc.ParseError; XMLError.ErrorCode ise<>0 Sonra XMLError ile, Memo1.Lines Ekle'ye başlar ('Dosya:' + URL); Ekle ('Kod:' + IntToStr (HataKodu)); Ekle ('Hata:' + Sebep); Ekle ('Metin:' + Kaynak Metin); Ekle ('Satır:' + IntToStr (Satır)); Ekle ('Konum:' + IntToStr (LinePos)); Else Memo1.Lines.Add'i sonlandırın (XMLDoc.XML); Son;</p><p>ve uygulamamızı çalıştırın. Sonuç olarak, hata hakkında aşağıdaki bilgileri alıyoruz.</p> <p>Yukarıdaki örnekten de görebileceğiniz gibi, XMLDOMParseError nesnesi tarafından döndürülen bilgiler, hatayı yerelleştirmek ve oluşma nedenini anlamak için oldukça yeterlidir.</p> <p>Şimdi kapatma elemanını geri yükleyeceğiz <TITLE>belgemizde ve XML DOM tartışmamıza devam edin.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge ağacına erişme</h2> <p>Belge ağacına erişmek için ya kök öğeyi alabilir ve ardından alt dalları üzerinde yineleyebilir ya da belirli bir dalı bulabilirsiniz. İlk durumda, XMLDOMNode türünde bir nesne döndüren DocumentElement özelliği aracılığıyla kök öğeyi alırız. Her alt öğenin içeriğini almak için DocumentElement özelliğini nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Var Düğüm: IXMLDOMNode; Kök: IXMLDOMElement; Ben: Tamsayı; ... Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alıyoruz.</p> <p>Belirli bir dalla veya ilk alt dalın altındaki bir dalla ilgileniyorsak, XMLDOMDocument nesnesinin NodeFromID yöntemini veya GetElementByTagName yöntemini kullanabiliriz.</p> <p>NodeFromID yöntemi, XML Şemasında veya Belge Türü Tanımında (DTD) tanımlandığı gibi benzersiz bir tanımlayıcı gerektirir ve bu tanımlayıcıya sahip bir dal döndürür.</p> <p>GetElementByTagName yöntemi, belirli bir öğeye (etiket) sahip bir dize gerektirir ve bu öğeye sahip tüm dalları döndürür. CD-ROM dizinimizde bulunan tüm sanatçıları bulmak için bu yöntemi nasıl kullanacağınız aşağıda açıklanmıştır:</p><p>Düğümler: IXMLDOMNodeList; Düğüm: IXMLDOMNode; ... Düğümler: = XMLDoc.GetElementsByTagName ('ARTIST'); I için: = 0 - Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Lines.Add (Düğüm.Metin); Son;</p><p>XML belgemiz için aşağıdaki metni alacağız</p> <p>XMLDOMNode nesnesinin SelectNodes yönteminin, belge dallarına erişmek için daha esnek bir yol sağladığını unutmayın. Ama daha fazlası aşağıda.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belge Dalı - XMLDOMNode Nesnesi</h2> <p>XMLDOMNode nesnesi bir belge dalını temsil eder. Belgenin kök öğesini aldığımızda bu nesneyle zaten karşılaştık:</p><p>Kök: = XMLDoc.DocumentElement;</p><p>Bir XML belgesinin bir dalı hakkında bilgi almak için XMLDOMNode nesnesinin özelliklerini kullanabilirsiniz (Tablo 1).</p> <p>Bir dalda depolanan verilere erişmek için, yaygın olarak ya NodeValue özelliği (öznitelikler, metin dalları, yorumlar, işleme talimatları ve CDATA bölümleri için kullanılabilir) ya da dalın metin içeriğini döndüren Text özelliği kullanılır. veya NodeTypedValue özelliği. Ancak ikincisi, yalnızca yazılan öğelere sahip dallar için kullanılabilir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Belge ağacında gezinme</h3> <p>XMLDOMNode nesnesi, belge ağacında gezinmek için birçok yol sağlar. Örneğin, üst dala erişmek için ParentNode özelliğini (XMLDOMNode türü) kullanın, alt dallara ChildNodes özellikleri (XMLDOMNodeList türü), FirstChild ve LastChild (XMLDOMNode türü) vb. aracılığıyla erişin. OwnerDocument özelliği, XML belgesinin kendisini tanımlayan bir XMLDOMDocument nesnesi döndürür. Yukarıda listelenen özellikler, belge ağacında gezinmeyi kolaylaştırır.</p> <p>Şimdi XML belgesinin tüm dalları arasında dolaşalım:</p><p>Kök: = XMLDoc.DocumentElement; I için: = 0 - Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Node.HasChildNodes ise GetChilds (Node, 0); Son;</p><p>Yukarıda belirtildiği gibi, XMLDOMNode nesnesinin SelectNodes'u, belge dallarına erişmek için daha esnek bir yol sağlar. Ayrıca, belgenin yalnızca ilk dalını döndüren bir SelectSingleNode yöntemi vardır. Bu yöntemlerin her ikisi de şube aramaları için XSL şablonları tanımlamanıza olanak tanır.</p> <p>CD dalı ve PRICE alt dalı olan tüm dalları getirmek için SelectNodes yöntemini kullanma sürecine bakalım:</p><p>Kök: = XMLDoc.DocumentElement; Düğümler: = Root.SelectNodes ('CD / FİYAT');</p><p>CD şubesinin tüm PRICE alt dalları Nodes koleksiyonuna yerleştirilecektir. XSL şablonlarını tartışmaya biraz sonra döneceğiz.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Alt dalları manipüle etme</h3> <p>Alt dalları değiştirmek için XMLDOMNode nesnesinin yöntemlerini kullanabiliriz (Tablo 2).</p> <p>İlk diskle ilgili kaydı tamamen silmek için aşağıdaki kodu çalıştırmanız gerekir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; Düğüm: = Kök; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Bu örnekte ilk alt dalı sildiğimizi unutmayın. İlk alt dalın ilk öğesinin nasıl kaldırılacağı aşağıda gösterilmiştir:</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.Load ('C: \ DATA \ DATA.xml'); // Kök elemanı al Root: = XMLDoc.DocumentElement; // ve ilk alt dal Node: = Root.FirstChild; // İlk alt dal Node.RemoveChild'i (Node.FirstChild) kaldırın;</p><p>Yukarıdaki örnekte ilk dalı değil sildik <CD>…</CD> ve dalın ilk elemanı <TITLE>….

Şimdi yeni bir dal ekleyelim. Yeni bir müzik CD-ROM girişinin nasıl ekleneceğini gösteren kod aşağıdadır:

Var NewNode: IXMLDOMNode; Alt: IXMLDOMNode; ... // Yeni bir dal oluştur - NewNode: = XMLDoc.CreateNode (1, 'CD', ''); // Bir eleman ekle Alt: = XMLDoc.CreateNode (1, 'TITLE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Pink Floyd'; // Bir eleman ekle <ARTIST>Alt: = XMLDoc.CreateNode (1, 'ARTIST', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = 'Division Bell'; // Bir eleman ekle <COUNTRY>Alt: = XMLDoc.CreateNode (1, 'ÜLKE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'UK'; // Bir eleman ekle <COMPANY>Alt: = XMLDoc.CreateNode (1, 'ŞİRKET', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = 'EMI Records Ltd.'; // Bir eleman ekle <PRICE>Alt: = XMLDoc.CreateNode (1, 'PRICE', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini ayarlayın Child.Text: = '11 .99 "; // Bir eleman ekleyin <YEAR>Alt: = XMLDoc.CreateNode (1, 'YIL', ''); // NewNode.AppendChild (Alt) öğesi ekleyin; // Ve değerini Child.Text: = '1994'; // Ve Root.AppendChild (NewNode) dalını ekleyin; ...</p><p>Yukarıdaki kod, yeni bir dal eklemek için aşağıdaki adımları gösterir:</p> <ul><li>CreateNode yöntemini kullanarak yeni bir dal oluşturma: <ul><li>CreateNode yöntemini kullanarak bir öğe oluşturma;</li> <li>AppendChild yöntemini kullanarak bir şubeye eleman ekleme;</li> <li>Text özelliği aracılığıyla bir öğenin değerini ayarlama;</li> <li>… Tüm öğeler için tekrarlayın.</li> </ul></li> <li>AppendChild yöntemini kullanarak belgeye yeni bir dal ekleme.</li> </ul><p>AppendChild yönteminin ağacın sonuna bir dal eklediğini hatırlayın. Ağaçta belirli bir yere dal eklemek için InsertBefore yöntemini kullanmanız gerekir.</p> <h2>Dal kümesi - XMLDOMNodeList nesnesi</h2> <p>XMLNodeList nesnesi, SelectNodes veya GetElementsByTagName yöntemleri kullanılarak oluşturulabilen ve ayrıca ChildNodes özelliğinden elde edilen dalların bir listesini içerir.</p> <p>Bu nesnenin kullanımını "Belge ağacında gezinme" bölümünde sağlanan örnekte zaten tartışmıştık. İşte bazı teorik yorumlar.</p> <p>Listedeki dal sayısı, Length özelliğinin değeri olarak elde edilebilir. Dallar 0'dan Uzunluk-1'e kadar indekslenir ve her bir dal, Item dizisindeki ilgili indekslenmiş öğe aracılığıyla erişilebilir.</p> <p>Dallar listesinde gezinme, listedeki bir sonraki dalı döndüren NextNode yöntemi veya mevcut dal son ise Nil kullanılarak da yapılabilir. Listenin başına dönmek için Sıfırlama yöntemini çağırın.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Belgeler oluşturun ve kaydedin</h2> <p>Bu nedenle, mevcut XML belgelerine nasıl dallar ve öğeler ekleyebileceğinizi ele aldık. Şimdi anında bir XML belgesi oluşturalım. Her şeyden önce, bir belgenin yalnızca bir URL'den değil, aynı zamanda normal bir dizeden de yüklenebileceğini unutmayın. Aşağıda, daha sonra öğelerin geri kalanını dinamik olarak oluşturmak için kullanılabilecek bir kök öğenin nasıl oluşturulacağı gösterilmektedir ("Alt dalları değiştirme" bölümünde zaten ele aldık):</p><p>Var XMLDoc: IXMLDOMDocument; Kök: IXMLDOMNode; Düğüm: IXMLDOMNode; S: GenişDize; ... S: = ' <CATALOG></CATALOG>'; XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Yanlış; XMLDoc.LoadXML (S); Kök: = XMLDoc.DocumentElement; Düğüm: = XMLDoc.CreateNode (1, 'CD', ''); Root.AppendChild (Düğüm); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: = Sıfır;</p><p>XML belgesini oluşturduktan sonra Kaydet yöntemini kullanarak bir dosyaya kaydedin. Örneğin:</p> <p>XMLDoc.Save ('C: \ DATA \ NEWCD.XML');</p> <p>Kaydet yöntemi, bir dosyaya kaydetmeye ek olarak, bir XML belgesini yeni bir XMLDOMDocument nesnesine kaydetmenize olanak tanır. Bu durumda, belge tamamen işlenir ve sonuç olarak yapısı ve sözdizimi kontrol edilir. Bir belgeyi başka bir nesneye nasıl kaydedeceğiniz aşağıda açıklanmıştır:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XMLDoc2: IXMLDOMDocument; XMLDoc2'yi başlat: = CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: = Sıfır; son;</p><p>Sonuç olarak, Kaydet yöntemi, XML belgesini IStream, IPersistStream veya IPersistStreamInit arabirimlerini destekleyen diğer COM nesnelerine kaydetmenize de olanak tanır.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>XSL Şablonlarını Kullanma</h2> <p>XMLDOMNode nesnesinin SelectNodes yöntemini tartışırken, belge dallarına erişmek için daha esnek bir yol sağladığından bahsetmiştik. Esneklik, dalları seçme kriteri olarak bir XSL şablonu belirtebilmenizdir. Bu tür şablonlar, XML belgelerinde bilgi bulmak için güçlü bir mekanizma sağlar. Örneğin, dizinimizde bulunan tüm müzik CD-ROM başlıklarının bir listesini almak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>Amerika Birleşik Devletleri'nde hangi sanatçıların disklerinin yayınlandığını öğrenmek için talep şu şekilde oluşturulur:</p><p>Düğümler: = Root.SelectNodes ('CD / SANATÇI');</p><p>Bir dizindeki ilk sürücüyü nasıl bulacağınız aşağıda açıklanmıştır:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Ve son olarak:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>Bob Dylan'ın disklerini bulmak için aşağıdaki sorguyu çalıştırabilirsiniz:</p><p>Düğümler: = Root.SelectNodes ('CD [$ herhangi bir $ SANATÇI =" Bob Dylan ”] / TITLE');</p><p>ve 1985'ten sonra yapılan disklerin bir listesini almak için aşağıdaki sorguyu çalıştırıyoruz:</p><p>Düğümler: = Root.SelectNodes ('CD / TITLE');</p><p>XSL sözdiziminin daha ayrıntılı bir tartışması ayrı bir yayın gerektirir. Okuyucuların ilgisini çekmek ve daha fazla araştırmayı teşvik etmek için, XSL'nin olası kullanımına dair sadece küçük bir örnek vereceğim. Diyelim ki dizinimizi normal bir HTML tablosuna dönüştürmemiz gerekiyor. Geleneksel yöntemleri kullanarak, ağacın tüm dallarını yinelemeliyiz ve alınan her eleman için karşılık gelen etiketleri oluşturmalıyız. <TD>…</TD>.</p> <p>XSL kullanarak, neyin ve nasıl dönüştürüleceğini belirten bir şablon (veya stil sayfası) oluşturuyoruz. Sonra bu şablonu kataloğumuza yerleştiriyoruz - ve işimiz bitti: bu, kataloğu bir tabloya dönüştüren XSL şablonunun metnidir (Liste 2).</p> <p>Dizinimizde bir XSL şablonunu kaplayacak kod şuna benzer:</p><p>Prosedür TForm1.Button2Click (Gönderen: TObject); var XSLDoc: IXMLDOMDocument; XSLDoc'u başlat: = CoDOMDocument.Create; XSLDoc.Load ('C: \ DATA \ DATA.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLDoc); XSLDoc: = Sıfır; son;</p><p>XSL ile ilgili tartışmamızı sonlandırırken, şu anda bu dilin çeşitli XML belgeleri arasında dönüşüm için ve ayrıca belgeleri biçimlendirmek için aktif olarak kullanıldığı söylenmelidir.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Çözüm</h2> <p>Açık nedenlerden dolayı, tüm Microsoft XML DOM nesnelerini kapsamak ve bunların kullanım örneklerini tek bir makalede sağlamak imkansızdır. Burada, uygulamalarda XML DOM kullanmanın temel konularına değindik. Tablo 3, Microsoft XML DOM'de uygulanan tüm nesneleri gösterir.</p> <p>BilgisayarBasın 12 "2000</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> </div> </div> </div> <aside class="col-lg-4 col-md-12 col-md-offset-4 col-lg-offset-0" id="right"> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> <div> </div> <br/> </aside> </div> </div> </div> <div class="popup" id="share"> <div class="perfect-scroll" style="text-align: center"> <div style="margin-bottom: 20px"> <strong>İndirme şimdi başlayacak...</strong> <br>Materyal paylaşmayı unutmayın <br>ile sosyal ağlarda <br>meslektaşlar</div> <div> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillrule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"></path> </svg> </div> </div> <section id="views"> <div class="container"> </div> </section> <script type="text/javascript"> $(document).ready( function () { $('.kursiv').readmore({ speed: 75, maxHeight: 84, heightMargin: 16, moreLink: '<a href="#"><span>Показать полностью</span>', lessLink: '<a href="#"><span>Скрыть</span></a>', } ); } ); </script> <style> div.kursiv { margin-bottom: 0; } #razrabotka { margin-top: 30px; } .readmore-js-toggle { font-style: italic; color: #999; display: inline; margin-right: 10px; font-size: 14px; cursor: pointer; border-bottom: 1px dotted #e6e6e6; } </style></section> <footer> <div class="container"> <div class="row"> <div class="col-xs-16 col-sm-4 col-md-3"> <p>© 2021, mkr-novo2.ru, İnternet. Eğitim. Programlar. Bellenim. Kurulum ve konfigürasyon. Gezginler</p> <div class="social"> <a target="_blank" href=""> <svg width="32px" height="19px" viewBox="0 0 32 19"> <path fillRule="evenodd" d="M 15.36 18.01C 15.36 18.01 17.24 18.01 17.24 18.01 17.24 18.01 17.81 17.94 18.1 17.64 18.36 17.37 18.35 16.85 18.35 16.85 18.35 16.85 18.32 14.41 19.49 14.05 20.64 13.7 22.12 16.4 23.69 17.45 24.87 18.23 25.77 18.06 25.77 18.06 25.77 18.06 29.97 18.01 29.97 18.01 29.97 18.01 32.16 17.87 31.12 16.21 31.03 16.07 30.51 14.97 28 12.72 25.37 10.35 25.72 10.74 28.89 6.65 30.82 4.16 31.59 2.65 31.35 2 31.12 1.38 29.7 1.54 29.7 1.54 29.7 1.54 24.98 1.57 24.98 1.57 24.98 1.57 24.63 1.52 24.37 1.67 24.12 1.82 23.95 2.16 23.95 2.16 23.95 2.16 23.21 4.09 22.21 5.72 20.11 9.18 19.27 9.36 18.92 9.15 18.12 8.65 18.32 7.14 18.32 6.07 18.32 2.72 18.85 1.32 17.3 0.96 16.79 0.84 16.41 0.76 15.1 0.75 13.41 0.73 11.99 0.76 11.18 1.14 10.64 1.39 10.23 1.96 10.48 1.99 10.79 2.03 11.5 2.18 11.88 2.67 12.36 3.31 12.34 4.74 12.34 4.74 12.34 4.74 12.62 8.68 11.69 9.17 11.06 9.5 10.18 8.82 8.31 5.68 7.35 4.08 6.62 2.3 6.62 2.3 6.62 2.3 6.48 1.97 6.23 1.8 5.93 1.58 5.51 1.51 5.51 1.51 5.51 1.51 1.02 1.54 1.02 1.54 1.02 1.54 0.35 1.56 0.1 1.84-0.12 2.09 0.08 2.62 0.08 2.62 0.08 2.62 3.6 10.57 7.57 14.57 11.22 18.25 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01 15.36 18.01Z"/> </svg> </a> <a target="_blank" href=""> <svg viewBox="0 0 25 25" width="25px" height="25px"> <path class="st0" d="M12.5,12.7c3.2,0,5.8-2.6,5.8-5.8c0-3.2-2.6-5.8-5.8-5.8C9.3,1,6.7,3.6,6.7,6.8C6.7,10,9.3,12.7,12.5,12.7z M12.5,3.9c1.6,0,2.9,1.3,2.9,2.9c0,1.6-1.3,2.9-2.9,2.9c-1.6,0-2.9-1.3-2.9-2.9C9.6,5.2,10.9,3.9,12.5,3.9z M19.2,13.4 c-0.3-0.7-1.2-1.2-2.5-0.3c-1.6,1.3-4.3,1.3-4.3,1.3s-2.6,0-4.3-1.3c-1.2-1-2.1-0.4-2.5,0.3c-0.6,1.2,0.1,1.7,1.5,2.7 c1.3,0.8,3,1.1,4.1,1.2l-0.9,0.9c-1.3,1.3-2.6,2.6-3.4,3.4c-0.5,0.5-0.5,1.4,0,1.9l0.2,0.2c0.5,0.5,1.4,0.5,1.9,0l3.4-3.4 c1.3,1.3,2.6,2.6,3.4,3.4c0.5,0.5,1.4,0.5,1.9,0l0.2-0.2c0.5-0.5,0.5-1.4,0-1.9l-3.4-3.4l-0.9-0.9c1.1-0.1,2.8-0.4,4.1-1.2 C19.2,15.1,19.8,14.5,19.2,13.4z"/> </svg> </a> <a target="_blank" href="https://facebook.com/"> <svg width="26px" height="25px" viewBox="0 0 26 25"> <path fillRule="evenodd" d="M 24.33-0C 24.33-0 1.96-0 1.96-0 1.19-0 0.57 0.62 0.57 1.38 0.57 1.38 0.57 23.62 0.57 23.62 0.57 24.38 1.19 25 1.96 25 1.96 25 14 25 14 25 14 25 14 15.32 14 15.32 14 15.32 10.72 15.32 10.72 15.32 10.72 15.32 10.72 11.54 10.72 11.54 10.72 11.54 14 11.54 14 11.54 14 11.54 14 8.76 14 8.76 14 5.53 15.98 3.77 18.88 3.77 20.27 3.77 21.46 3.88 21.81 3.92 21.81 3.92 21.81 7.3 21.81 7.3 21.81 7.3 19.8 7.3 19.8 7.3 18.22 7.3 17.92 8.04 17.92 9.13 17.92 9.13 17.92 11.54 17.92 11.54 17.92 11.54 21.68 11.54 21.68 11.54 21.68 11.54 21.19 15.32 21.19 15.32 21.19 15.32 17.92 15.32 17.92 15.32 17.92 15.32 17.92 25 17.92 25 17.92 25 24.33 25 24.33 25 25.09 25 25.71 24.38 25.71 23.62 25.71 23.62 25.71 1.38 25.71 1.38 25.71 0.62 25.09-0 24.33-0Z"/> </svg> </a> <a target="_blank" href="https://youtube.com/"> <svg width="26px" height="19px" viewBox="0 0 26 19"> <path fillRule="evenodd" d="M 25.75 14.46C 25.75 14.46 25.5 16.18 24.75 16.93 23.79 17.92 22.72 17.93 22.23 17.99 18.71 18.24 13.43 18.25 13.43 18.25 13.43 18.25 6.89 18.19 4.88 18 4.32 17.89 3.06 17.92 2.11 16.93 1.35 16.18 1.11 14.46 1.11 14.46 1.11 14.46 0.86 12.45 0.86 10.44 0.86 10.44 0.86 8.55 0.86 8.55 0.86 6.54 1.11 4.52 1.11 4.52 1.11 4.52 1.35 2.81 2.11 2.05 3.06 1.06 4.14 1.06 4.63 1 8.15 0.75 13.42 0.75 13.42 0.75 13.42 0.75 13.43 0.75 13.43 0.75 13.43 0.75 18.71 0.75 22.23 1 22.72 1.06 23.79 1.06 24.75 2.05 25.5 2.81 25.75 4.52 25.75 4.52 25.75 4.52 26 6.54 26 8.55 26 8.55 26 10.44 26 10.44 26 12.45 25.75 14.46 25.75 14.46ZM 10.83 5.73C 10.83 5.73 10.83 12.72 10.83 12.72 10.83 12.72 17.62 9.24 17.62 9.24 17.62 9.24 10.83 5.73 10.83 5.73Z"/> </svg> </a> </div> </div> <div class="col-lg-2 col-sm-4 col-xs-16 links"> <h4>mkr-novo2.ru</h4> <a href="https://mkr-novo2.ru/tr/category/internet/">internet</a> <a href="https://mkr-novo2.ru/tr/category/multimedia/">Multimedya</a> <a href="https://mkr-novo2.ru/tr/category/navigation/">Gezginler</a> <a href="https://mkr-novo2.ru/tr/category/education/">Eğitim</a> <a href="https://mkr-novo2.ru/tr/category/at/">ÜZERİNDE</a> <a href="https://mkr-novo2.ru/tr/category/problems/">sorunlar</a> </div> <div class="col-lg-2 col-sm-3 col-xs-16 links"> <h4>proje hakkında</h4> <a href="">Geri bildirim</a> <a href="">site hakkında</a> </div> <div class="col-lg-5 col-sm-1 col-xs-16 links"></div> <div class="col-lg-4 col-sm-5 col-xs-16 links"> </div> </div> <div class="row v-center"> <div class="col-md-8 col-xs-16"> <a data-fancybox data-type="iframe" data-src="">Kişiler</a> </div> <div class="col-md-8 col-xs-16"> <div class="share pull-right"> <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script> <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir,gplus" data-counter=""></div> </div> </div> </div> </div> </footer> <a href="#bot" id="to-top"> <svg width="50px" height="50px" viewBox="0 0 50 50"> <circle cx="25.00" cy="25.00" r="25.00" fill="rgb(0,0,0)" opacity="0.37"/> <path fillRule="evenodd" d="M 33.94 24.46C 33.94 24.46 25.89 16.3 25.89 16.3 25.32 15.73 24.41 15.73 23.84 16.3 23.84 16.3 15.79 24.46 15.79 24.46 14.88 25.38 15.52 26.97 16.81 26.97 16.81 26.97 20.43 26.97 20.43 26.97 21.23 26.97 21.88 27.62 21.88 28.43 21.88 28.43 21.88 32.51 21.88 32.51 21.88 33.71 22.83 34.68 24.01 34.68 24.01 34.68 25.72 34.68 25.72 34.68 26.9 34.68 27.86 33.71 27.86 32.51 27.86 32.51 27.86 28.43 27.86 28.43 27.86 27.62 28.5 26.97 29.31 26.97 29.31 26.97 32.92 26.97 32.92 26.97 34.21 26.97 34.85 25.38 33.94 24.46Z" fill="rgb(241,241,241)"/> </svg> </a> <div class="overlay"></div> <div class="popup" id="password"> <div class="perfect-scroll"> <h2>Şifre kurtarma <div class="close-pop pull-right"> <svg width="10px" height="10px" viewBox="0 0 10 10"> <path fillRule="evenodd" d="M 6.41 5C 6.41 5 9.24 7.83 9.24 7.83 9.63 8.22 9.63 8.85 9.24 9.24 8.85 9.63 8.22 9.63 7.83 9.24 7.83 9.24 5 6.41 5 6.41 5 6.41 2.17 9.24 2.17 9.24 1.78 9.63 1.15 9.63 0.76 9.24 0.37 8.85 0.37 8.22 0.76 7.83 0.76 7.83 3.59 5 3.59 5 3.59 5 0.76 2.17 0.76 2.17 0.37 1.78 0.37 1.15 0.76 0.76 1.15 0.37 1.78 0.37 2.17 0.76 2.17 0.76 5 3.58 5 3.58 5 3.58 7.83 0.76 7.83 0.76 8.22 0.37 8.85 0.37 9.24 0.76 9.63 1.15 9.63 1.78 9.24 2.17 9.24 2.17 6.41 5 6.41 5Z"/> </svg> </div> </h2> <div class="recover-success"> <form action="/recovery/request" data-method="post" method="post" class="recover_form"> <p>Şifrenizi kurtarmak için e-posta adresinizi girin!</p> <div class="input-wrp"> <input name="email" type="text" placeholder="E-postanızı giriniz"> </div> <input type="submit" data-disable-with="Отправить..." class="btn green" value="göndermek"> </form> </div> <div class="auth-form_error" style="padding-top: 10px"></div> </div> </div> <script> $('.user.one').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.one').addClass('active-user'); $('#user_type').val('1'); e.stopPropagation(); } ); $('.user.two').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.two').addClass('active-user'); $('#user_type').val('2'); e.stopPropagation(); } ); $('.user.three').click(function (e, ob) { $('.user').removeClass('active-user'); $('.user.three').addClass('active-user'); $('#user_type').val('3'); e.stopPropagation(); } ); function clearErrors() { $('.auth-form_error').each(function () { $(this).html(''); } ); } $('body').on('click', '.open-login-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#login, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('body').on('click', '.open-pass-form', function (e) { $('#register, .overlay').removeClass('visible-pop'); $('#password, .overlay').addClass('visible-pop'); e.preventDefault(); } ); $('.login_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.open-register').html(data.text); var delay = 1000; window.location.href = url = window.location.href + "?login=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.recover_form') .on('ajax:beforeSend', function (event, xhr, settings) { clearErrors(); } ) .on('ajax:complete', function (event, xhr, status) { } ) .on('ajax:success', function (event, data, status, xhr) { console.log(data); if (data.status == 0) { $('.auth-form_error').html(data.text + '<br>'); } else { $('.recover-success').html('<div class="success" >' + data.text + '</div>'); } } ).on('ajax:error', function (event, xhr, status, error) { } ); $('.registration_form') .on('ajax:beforeSend', function (event, xhr, settings) { var emailError = $('#emailError'); var passwordError = $('#passwordError'); var passwordVerify = $('#passwordVerifyError'); var userTypeError = $('#userTypeError'); var emailExist = $('#emailExist'); emailError.html(''); passwordError.html(''); passwordVerify.html(''); userTypeError.html(''); emailExist.hide(); } ) .on('ajax:complete', function (event, xhr, status) { } ).on('ajax:success', function (event, data, status, xhr) { // insert the failure message inside the "#account_settings" element //console.log(data); if (data.status == 0) { //$('.reg-info').html('<div class="error">' + data.text + '</div>'); if (data.text.email) { var emailError = $('#emailError'); var emailExist = $('#emailExist'); console.log(data.text.email); if (data.text.email == 'Найдена совпадающая со значением запись') { console.log('alert'); emailExist.show(); } else { emailError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.email + '</span></div></div>'); } } if (data.text.password) { var passwordError = $('#passwordError'); console.log(data.text.password); passwordError.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.password + '</span></div></div>'); } if (data.text.passwordVerify) { var passwordVerify = $('#passwordVerifyError'); console.log(data.text.passwordVerify); passwordVerify.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.passwordVerify + '</span></div></div>'); } if (data.text.captcha) { var captcha = $('#captchaError'); console.log(data.text.captcha); captcha.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.captcha + '</span></div></div>'); } if (data.text.userType) { var user_type = $('#userTypeError'); console.log(data.text.userType); user_type.html('<i class="icon-error"></i><div class="error_note_wrapper">' + '<div class="error_note">' + '<span class="error_note_text">' + data.text.userType + '</span></div></div>'); } } else { $('.reg-success').html(data.text); var delay = 2000; window.location.href = url = window.location.href + "?reg=ok"; location.replace(url); setTimeout('window.location.reload(true);', delay); } } ).on('ajax:error', function (event, xhr, status, error) { } ); </script> <div class="popup" id="premium-pop"> </div> <link rel="stylesheet" href="/videouroki/res/lightslider/lightslider.min.css"> <link rel="stylesheet" href="/videouroki/res/perfectScrollbar/perfect-scrollbar.css"> <link rel="stylesheet" href="/videouroki/assets/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="/assets/vendor/fancybox/jquery.fancybox.min.css"> <script src="/videouroki/res/perfectScrollbar/perfect-scrollbar.jquery.min.js"></script> <script src="/js/rails.js"></script> <script src="/videouroki/res/lightslider/lightslider.min.js"></script> <script src="/videouroki/res/jquery.validate.min.js"></script> <script src="/videouroki/res/autosize-master/autosize.min.js"></script> <script src="/videouroki/js/tabs.js"></script> <script src="/videouroki/js/select.js"></script> <script src="/videouroki/js/global.js?2109"></script> <script src="/videouroki/js/views.js"></script> <script src="/videouroki/plugin/notify/notify.min.js"></script> <script src="/videouroki/plugin/notify/notify-metro.js"></script> <script src="/videouroki/js/lazyload.min.js"></script> <script src="/assets/vendor/fancybox/jquery.fancybox.min.js"></script> <script type="text/javascript"> $(document).ready( function () { // new LazyLoad(); } ) </script> <!--[if gte IE 9]><script type="text/javascript" src="/videouroki/assets/ckeditor-mini/ckeditor.js"></script><![endif]--> <script type="text/javascript" src="/videouroki/js/readmore.js"></script></body> </html>