Menu
Jest wolny
rejestracja
Dom  /  Problemy/ Przewodnik po Internecie - cała zabawa w sieci. Korzystanie z XML Document Object Model Jak utworzyć plik delphi xml

Internetowy przewodnik turystyczny - cała zabawa w sieci. Korzystanie z XML Document Object Model Jak utworzyć plik delphi xml

ZAMÓW ROZWIĄZANIE DO DELPHI
Delphi jest drugim najważniejszym językiem programowania, z którym studenci są najczęściej wprowadzani w procesie uczenia się. To początek nauki programowania obiektowego. Jako student doszedłem do wniosku, że nie ma łatwiejszej metody nauki języka niż napisanie w nim kalkulatora. Nawet jeśli zaimplementujesz podstawową funkcję dodawania dwóch liczb, rzuci to dużo światła.

CodeGaear, Delphi 7, Lazarus to różne kompilatory, programy, które przeniosą napisany przez Ciebie kod na maszynę, konwertując go na jedyne i jedyne. Są to wszystkie programy do tworzenia programów, a nie osobne języki programowania. Te kompilatory używają języka programowania Object Pascal, który jest podstawą języka Delphi, który jest podobny w składni do zwykłego Pascala, ale funkcjonalnie znacznie się różni.

Jaka jest składnia języka programowania?

To jest format do pisania różnych operatorów. Na przykład pętla for Pascal ma następujący format: for n: = 1 do k do i tak dalej.

W języku programowania C++ ta sama pętla jest napisana trochę inaczej: for (n = 1; n Piszemy kalkulator

Dzięki temu zrozumiesz, w jaki sposób obiekty współdziałają z kodem programu, czym są „zmienne” i jak działają funkcje matematyczne. Każde programowanie będzie w każdym przypadku obliczeniem. Gra to także program, który ciągle coś oblicza, pracuje z liczbami i funkcjami numerycznymi. Programowanie jest nierozerwalnie związane z matematyką.

Do pisania użyjmy środowiska programistycznego Lazarus. Jego funkcjonalność nie jest tak bogata jak np. CodeGear, ale jest dostępna bezpłatnie i przeznaczona do szkoleń.

Otwierając środowisko programistyczne widzimy formularz i przybornik. Oto formularz.

Oto przybornik.

Pierwszą rzeczą, którą zrobimy, jest dodanie trzech elementów potrzebnych do zaimplementowania funkcji dodawania dwóch liczb. Potrzebujemy: "Tedit" w ilości trzech sztuk oraz "TButton". Na poniższym obrazku są one pokazane na panelu ze strzałkami. Klikamy na nie raz, a potem raz na formularz i pojawiają się na nim.

Są to pola tekstowe do wprowadzania danych i zwykły przycisk. Na te elementy można się natknąć, używając prawie każdego Program Windows... Spójrz.


Teraz wyczyśćmy te etykiety. Kliknij kartę „Widok”. I kliknij element „Inspektor obiektów. Pojawi się takie okno.

Klikamy raz na nasz element "Przycisk" w formularzu i zmieniamy wartość "Podpis" w oknie inspektora na dowolną inną. Na przykład słowo „Ok”. Wciskamy Enter. Na formularzu widzimy, jak element zmienił swoją nazwę.

Zróbmy to samo z edycjami, tylko nie zmieniaj ich nazw, ale stwórzmy je bez żadnej zawartości. Zaznacz je po kolei i wyczyść wartość Tekst w inspektorze. Nie zapomnij nacisnąć Enter.

W rezultacie nasz formularz wygląda tak.


Teraz, aby nasz kalkulator działał, musisz zarejestrować wymagane kod programu dla naszej procedury przycisku. Kliknij dwukrotnie element Button i otwórz edytor źródeł.

Widzieć? Procedura Przycisk1Kliknij. Jest to procedura, która odpowiada za to, co dzieje się po jednokrotnym kliknięciu przycisku. I powinno się wydarzyć co następuje: program musi wyświetlić sumę liczb wpisanych w pierwszych dwóch polach w trzeciej Edycji. Piszemy kod.

Musimy napisać takie proste 5 linijek kodu. Komentarze i wyjaśnienia można zobaczyć na powyższym obrazku. Następnie naciskamy ten przycisk.

Nasz projekt zostanie skompilowany. Zostanie skompilowany do programu. W pierwszych dwóch polach wpisujemy liczby, klikamy przycisk i otrzymujemy wartość sumy.

Wniosek

Możesz kliknąć przycisk „Plik”, a następnie „Zapisz wszystko”, wybierz folder do zapisania, a otrzymasz pełnoprawny program, który można uruchomić z pulpitu. Teraz spróbuj sam wymyślić, co musisz przepisać w tym kodzie, aby program dzielił dwie liczby, a nie dodawał. Wskazówka: musisz zmienić typ danych. Poniższy film pokazuje podobny przykład, ale w środowisku Delphi 7, a nie Lazarusa.

Dla wielu programistów Delphi zapisywanie ustawień wiąże się z używaniem INI pliki w swoich programach. Podanie Ta metoda, w mniej lub bardziej poważnych projektach należy unikać, ponieważ ogranicza to elastyczność, co uniemożliwia dalszą rozbudowę programu. Należy powiedzieć, że takie podejście jest dość popularne ze względu na łatwość obsługi i obecność wbudowanych narzędzi w środowisku programistycznym.

Jednak uporządkowane XML pliki. Ich zaletą jest to, że nie można ustalić liczby parametrów. Aby lepiej to zrozumieć, rozważ konkretny przykład.

W programie USearch po kliknięciu na wpis pojawia się menu kontekstowe, w którym wyświetlana jest lista pozycji. Te elementy to polecenia, które z kolei są ładowane z pliku ustawień. W przypadku, gdy ustawienia zostały zapisane w INI plik, wtedy program może zapisać i załadować określoną liczbę poleceń, na przykład 10 lub 50. Gdy tylko wymagana będzie większa wartość, będziesz musiał przepisać kod i odpowiednio go ponownie skompilować.


Stosowanie podejścia za pomocą XML pliki, będziemy mogli dynamicznie wczytać wszystkie parametry sekcji. Ponadto plik konfiguracyjny stanie się bardziej elegancki, bez zbędnej numeracji parametrów. Ale, standardowe środki pracować z XML Delphi ma wiele wad, więc polecam używać standardowa biblioteka MSXML... Zwykle jest domyślnie zawarty w system operacyjny Rodzina okien.


Połączyć MSXML, musimy stworzyć plik interfejsu z listą wszystkich funkcji importując go z serwera COM. Napisano wiele szczegółowych artykułów na temat importowania interfejsu, ale sugeruję pobranie pliku MSXML2_TLB.PAS gotowy do użycia. Po pobraniu pliku umieść go obok swojego projektu lub upuść w folderze lib środowiska Delphi. Więc wszystko stworzone programy będzie mógł korzystać z modułu MSXML, wystarczy dodać wiersz MSXML2_TLB do użycia.

Dla jasności rozważmy następujący przykład użycia tej biblioteki:

Procedura LoadData; var XMLDoc: DOMDocument; Korzeń: IXMLDOMEelement; rozpocznij XMLDoc: = CoDOMDocument.Create; XMLDoc.Load ("settins.xml"); Katalog główny: = Dokument XML.DocumentElement; ShowMessage (Root.SelectSingleNode ("rozmiar / szerokość"). Tekst); Korzeń: = zero; Dokument XML: = brak; kończyć się;

Najpierw tworzona jest instancja klasy DOMDocument, a następnie do pamięci ładowana jest zawartość pliku settings.xml. Ponieważ według standardu dowolny XML plik musi zawierać znacznik główny (w tym przypadku konfiguracja), to musimy go uzyskać za pomocą funkcji Element dokumentu... Następnie treść jest wyświetlana między tagami. , które z kolei znajdują się między tagami ... Tak więc z pliku settings.xml nasza metoda wyświetli tekst w MessageBox „100 pikseli”.

500px 100px

Tutaj stosowana jest metoda SelectSingleNode, która jako parametr przyjmuje ciąg

Witam! Ten blog jest o Internecie i komputerach, a raczej im poświęcony.

Prawdopodobnie od razu widać, że od wielu lat w serwisie nie pojawiają się żadne nowe artykuły. Tak, taki jest los większości blogów. Ten projekt był kiedyś ambitnym przedsięwzięciem, a autor, podobnie jak wielu innych piszących w tamtym czasie, miał ambitne plany, by stać się jednym z najlepszych rosyjskich blogerów. Cóż, jeśli spojrzysz teraz, to z tych blogów, które powstały równolegle z moim, większość już zniknęła w wieczności. A ja po prostu nie miałem czasu na blogowanie. Więc tak, nie jest już aktualizowany. Chociaż raz z tą stroną wygraliśmy konkurs "Blog Runet 2011".

Miałem nawet pomysł, aby to wszystko usunąć, ale potem przejrzałem stare materiały i zdałem sobie sprawę, że nadal mogą być przydatne dla czytelników. Tak, niektóre artykuły są nieaktualne (jeśli starczy mi sił, otrzymają odpowiednie notatki), ale strona np. może się przydać początkującym - tutaj możesz poczytać podstawowe koncepcje Internet, dowiedz się, jak skonfigurować Internet, Windows, a nawet zdecyduj się na przejście na Linuksa. Spójrz więc na rubryki i wybierz ten, który najbardziej Ci odpowiada.

A jednak mam nadzieję, że to coś więcej niż blog, ale prawdziwy przewodnik po Internecie. Stronę można przeglądać w trybie katalogowym, gdzie wszystkie dostępne artykuły są uporządkowane według kategorii. A kto wie, może pewnego dnia zaczną się tu pojawiać nowe artykuły wysokiej jakości.

Sander

Picodi.ru to portal rabatowy firmy International Coupons, polskiego eksperta od oszczędzania i tanich zakupów. Polacy są uważani za jeden z najbardziej ekonomicznych narodów na świecie, nic więc dziwnego, że tego typu projekty wyrosły z polskiego startupu kodyrabatowe.pl. Jak ten portal może być przydatny dla zwykłego użytkownika Internetu w Rosji?

Nowoczesne telefony z Androidem to coś więcej niż telefony. Przyzwyczajasz się do pisania zainstalowane programy, do historii połączeń i wiadomości tekstowych, kolekcji zdjęć i nie tylko. Ale czas mija, a urządzenie, które Ci odpowiada, całkowicie zaczyna zwalniać, uszkadzać się lub po prostu tracić swój reprezentacyjny wygląd z powodu chipów na obudowie lub zadrapań na ekranie. Powstaje pytanie o wybór nowego telefonu i zmianę telefon z systemem Android... A jeśli teraz ominiemy kwestię wyboru, to „przejdziemy” do nowy telefon pozostaje poważnym problemem - absolutnie nie chcesz zaczynać wszystkich danych od zera. O tym dzisiaj będziemy rozmawiać.

Większość czytelników tego bloga najprawdopodobniej nigdy nie spotkała się z systemami kontroli wersji i nie natknie się na żaden w najbliższej przyszłości. Szkoda. Ten niezwykle wygodny wynalazek jest szeroko stosowany przez programistów, ale moim zdaniem może być bardzo przydatny dla tych, którzy aktywnie pracują z tekstami. Ale prawdopodobnie teraz nie ma jednego systemu kontroli wersji, który byłby łatwy do uruchomienia w „biurze” ( Microsoft Office) Praca. Niemniej jednak uważam, że materiał przedstawiony w artykule może zainteresować wszystkich czytelników.

Jeśli zastanawiałeś się, jak oglądać filmy w sieci z telewizora i korzystać z Internetu, ten artykuł jest dla Ciebie. Nie, wiem, że niektóre telewizory mają już funkcję Smart TV, ale nigdy nie widziałem, aby działała poprawnie. Najwyraźniej więc niedawno korporacja Google zademonstrowała absolutnie oszałamiające urządzenie, które od razu stało się sensacją. Mówimy o streamerze multimedialnym Chromecast (Chromcast), bardziej zaawansowanej i niedrogiej wersji zeszłorocznego katastrofalnego Nexusa Q.

Dongle Chromcast, który ma mniej niż 2 cale, podłącza się do portu Telewizor HDMI i pozwala cieszyć się oglądaniem strumieniowych treści internetowych. Do sterowania streamerem można wykorzystać dowolne urządzenie (tablet, PC, smartfon) oparte na platformie operacyjnej iOS, Windows, Android lub Mac OS.

Ten artykuł dotyczy systemu urządzeń pamięć androida, problemy, które mogą powstać z powodu jego braku i sposoby ich rozwiązania. Nie tak dawno temu sam miałem do czynienia z faktem, że mój telefon z Androidem zaczął regularnie wysyłać komunikaty o niewystarczającej pamięci podczas próby zainstalowania aplikacji. Co było dla mnie bardzo dziwne, biorąc pod uwagę, że zgodnie z opisem na rynku powinno być około 16 GB, a dodatkowo tę objętość zwiększyłem dodatkową kartą pamięci. Pojawił się jednak problem i musiałem dużo majstrować, zanim znalazłem odpowiednie rozwiązanie, które nie wymagało dostępu do roota ani pełne wyzdrowienie telefon do stanu fabrycznego.

Ostatnio wiele uwagi poświęca się budowie systemów e-biznesowych, czy też jak się je nazywa - B2B (business to business). Uwzględniając zalecenia dotyczące budowy systemów wymiany strumieniowej organu koordynującego technologie internetowe - WWW Consortium: nacisk położony jest na technologie XML oraz budowę systemów wymiany dokumentów XML.

Zaleta używania XML w biznes elektroniczny- wysoka wydajność systemów B2B przy niskich kosztach jej tworzenia dzięki przejrzystej i wizualnej prezentacji ustrukturyzowanych informacji, możliwość wykorzystania nowoczesnych protokoły sieciowe oraz tworzenie systemów biznesowych czasu rzeczywistego.

Niezależność prezentacji informacji w formie Dokumenty XML pozwala różnym firmom zajmującym się e-biznesem wytwarzać oprogramowanie niezależnie od siebie.

We wszystkich systemach giełda z reguły jest budowana według tego samego schematu, z wykorzystaniem żądań HTTP. Protokół SSL jest używany jako protokół bezpieczeństwa informacji (ale to osobny temat).

Jeden z możliwe opcje Przetwarzanie komunikatów XML to konstrukcja aplikacji BIN/CGI (ISAPI) lub komponentów COM (serwer), które tworzą lub przetwarzają dokumenty XML.

Z jednej strony aplikacja pełni rolę klienta, który wysyła żądanie HTTP w trybie POST, z drugiej strony znajduje się serwer WEB, po stronie którego jest przetwarzane żądanie i wystawiana odpowiedź. Wymiana informacji wykorzystuje dokumenty XML.

Jedną z najbardziej wydajnych opcji implementacji jest użycie istniejącego parsera XML obsługującego model DOM. Takim parserem jest dystrybucja Win'98 lub część IE 4.7 i nowsze (dla Win`95) i reprezentuje serwer COM znajdujący się w bibliotece msxml.dll.

Component Object Model (COM) - przedstawia enkapsulowane dane i metody w jedną całość oraz sposób dostępu do nich poprzez system interfejsów. Używając narzędzi Delphi, dość łatwo jest uzyskać dostęp do klas obiektu COM (kilka klas może być zawartych w jednym serwerze COM). Dostęp do obiektów uzyskuje się poprzez inicjowanie instancji klasy za pośrednictwem systemu interfejsów. Opis interfejsów realizowany jest za pomocą języka definicji interfejsów (IDL), który może być realizowany automatycznie za pomocą środowiska.

Narzędzia Delphi służą do importu z serwera COM msxml.dll, budowane są pliki do opisu interfejsu IDL oraz plik do binarnego opisu typów bibliotek - TLB. Ta operacja realizowane poprzez menu systemowe: Projekt | Import biblioteki typów:(obrazek 1). Następnie pojawia się okno dialogowe (Rysunek 2), w którym należy wybrać obiekt COM (w naszym przypadku obiekt jest zarejestrowany pod nazwą „Microsoft.XMLDom (Wersja 2.0)”) i utworzyć plik TLB (przycisk Utwórz jednostkę). Korzystając z pliku TLB, framework generuje plik opisu serwera Pascal COM - MSXML_TLB.pas

Plik MSXML_TLB.pas opisuje wszystkie interfejsy, stałe i koklasy serwera COM.

Aby uzyskać dostęp do obiektów elementu COM, potrzebujesz w dyrektywie ZASTOSOWANIA dodaj nazwę pliku opisu biblioteki (MSXML_TLB.pas). Poniżej znajduje się prosty program wykorzystujący standardowy parser DOM msxml.dll, który ładuje dokument XML i wyświetla go w elemencie pola tekstowego Memo1.

używa Windows, komunikaty, narzędzia systemowe, klasy, grafika, kontrolki, formularze, okna dialogowe, OleServer, MSXML_TLB, StdCtrls; rodzaj TForm1 = klasa(TForm) Przycisk1: Przycisk T; Nota 1: Notatka; procedura Button1Click (Nadawca: TObject); kończyć się; var Form1: TForm1; realizacja($R * .DFM) Procedura TForm1.Button1Click (nadawca: obiekt); // deklaracja soklasy obiektu DOMDocument; var coDoc: dokument CoDOM; // klasa zgodna z interfejsem IDOMDocument; var Dokument: IXMLDOMDokument; rozpocząć // utwórz instancję obiektu DOMDocument; Dokument: = coDoc.Utwórz; // wywołaj metodę Load instancji obiektu DOMDocument; Doc.load ("data.xml"); // dostęp do właściwości xml instancji DOMDocument; Memo1.Tekst: = Doc.xml; kończyć się; kończyć się.

Koncepcja DOM - obiektowy model dokumentu

Każdy dokument XML jest reprezentowany jako zbiór wielu obiektów (klas), za pomocą których możliwy jest dostęp poszczególne elementy(pola obiektów). DOM - interfejs opisuje dostęp zarówno do prostych obiektów, takich jak DOMString czy CharacterData, jak i do części lub oddzielnych Elementy XML dokument: DOMFragmentElement, DOMNode, DOMElement.

Poniżej przedstawiono najważniejsze właściwości i metody obiektów XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Należy zauważyć, że przedstawione poniżej metody i funkcje obiektów DOM (Document Object Model) są wykorzystywane przez parser Microsoft XML msxml.dll i są nieco szersze niż model zatwierdzony przez W3C DOM Consortium.

Więcej Pełny opis Interfejs obiektów DOM można znaleźć pod adresem

Obiekt XMLDOMDocument
Reprezentuje najwyższy poziom hierarchii obiektów i zawiera metody pracy z dokumentem: ładowanie go, analizowanie, tworzenie elementów, atrybutów, komentarzy itp. ...
Nieruchomości
Asynchroniczny Właściwość identyfikująca aktualny tryb przetwarzania
Błąd przetwarzania Zwraca referencję do obiektu obsługi błędów XMLDOMParseError
Włącz - wyłącz weryfikację dokumentów.
adres URL Zwraca adres URL dokumentu
element dokumentu Zawiera odniesienie do głównego elementu dokumentu jako obiekt XMLDOMElement.
Metody
wczytaj (adres URL)
loadXML (xmlString)
Ładuje dokument XML,
zapisz (objTarget) Zapisuje dokument XML do pliku
anulować Przerwanie procesu ładowania i przetwarzania dokumentu.
utwórzAtrybut (nazwa) Tworzy nowy atrybut o określonej nazwie dla bieżącego elementu.
createNode (Typ, nazwa, nazwaSpaceURI) Tworzy węzeł określonego typu i nazwy
createElement (nazwa_znacznika) Tworzy element dokumentu o określonej nazwie.
utwórz węzełTekstowy (dane) Tworzy tekst w dokumencie
getElementsByTagName (zmienna) Zwraca referencję do kolekcji elementów dokumentu o podanej nazwie
nodeFromID (idString) Znajdź element według ID

Obiekt XMLDOMNode
Obiekt XMLDOMNode, który implementuje podstawowy interfejs DOM Węzeł, jest przeznaczony do manipulowania oddzielnym węzłem drzewa dokumentu. Jego właściwości i metody pozwalają uzyskać i zmienić pełne informacje o bieżącym węźle - jego typ, nazwę, pełną nazwę, zawartość, listę elementów podrzędnych itp.
Nieruchomości
NazwaWęzła, NazwaBazowa Zwraca nazwę bieżącego węzła.
prefiks Zwraca prefiks przestrzeni nazw.
typ danych Określa typ zawartości bieżącego węzła
nodeType, nodeTypeString Zwraca typ bieżącego węzła:
atrybuty Pobiera listę atrybutów bieżącego węzła jako kolekcję XMLDOMNamedNodeMap.
tekst Zwraca zawartość bieżącego poddrzewa jako tekst
xml Zwraca reprezentację XML bieżącego poddrzewa.
nodeValue Zwraca zawartość bieżącego węzła.
childNodes Zwraca listę elementów podrzędnych jako XMLDOMNodeList.
pierwsze dziecko, ostatnie dziecko Zwraca pierwsze/ostatnie dziecko
poprzedni rodzeństwo, następny rodzeństwo Zwraca poprzedni/następny element rodzeństwa.
rodzicNode Zawiera łącze do elementu nadrzędnego.
właścicielDokument Zwraca wskaźnik do dokumentu zawierającego bieżący węzeł.
Metody
appendChild (noweChild) Dodaje nowe dziecko do bieżącego węzła.
insertBefore (newChild, refChild) Wstawia węzeł podrzędny, umieszczając go w bieżącym poddrzewie po lewej stronie węzła określonego przez refChild.
cloneNode (głęboki) Tworzy kopię bieżącego elementu.
pobierzAtrybut(Nazwa)
getAttributeNode(Nazwa)
setAttribute (nazwa, wartość)
setAttributeNode (XMLDOMAttribute)
Dostęp do atrybutów (tworzenie, odczyt, zapis) obiektu. Nazwa to nazwa atrybutu, wartość to jego wartość. Zwraca wartość obiektu XMLDOMAttribute.
zastąpDziecko (noweDziecko, stareDziecko) usuńDziecko (stareDziecko) Zastąpienie obiektu oldChild bieżącej listy obiektów podrzędnych przez newChild. Usuwanie obiektu oldChild
selectNodes (patternString) selectSingleNode (patternString) Zwroty Obiekt XMLDOMNodeList, wybrany według wzorca wyszukiwania lub pierwszego węzła
transformNode (arkusz stylów)
transformNodeToObject (arkusz stylów, outputObject)
Przypisuje arkusz stylów do poddrzewa bieżącego węzła i zwraca ciąg, który jest wynikiem przetwarzania. Parametr jest odniesieniem do obiektu DOMDocument, który zawiera instrukcje XSL.

Wykorzystanie XML w biznesie.

Aby uzyskać wyraźniejszy obraz, potrzebne jest wyjaśnienie i dlaczego to wszystko jest potrzebne, aby zrozumieć, jak to działa:

Budując system B2B lub korporacyjny ERP, organizując wymianę informacji dokumentów XML pomiędzy przedsiębiorstwami lub oddziałami pr-I, wykorzystywany jest sprawnie sprawdzony system przesyłania informacji oparty na istniejących serwerach WEB poprzez protokoły HTTP.

Z jednej strony aplikacja pełni rolę klienta, który wysyła żądanie HTTP w trybie POST, z drugiej strony znajduje się serwer WEB, po stronie którego jest przetwarzane żądanie i wystawiana odpowiedź. Dokumenty XML są używane jako wymiana.

Np. w prostym korporacyjnym systemie ERP, programie księgowym (ACS Accounting) konieczne jest złożenie wniosku o fakturę i przesłanie jej do oddziału posiadającego magazyn (ACS Warehouse). AWP Podobne zgłoszenie problemu przy tworzeniu systemu B2B, gdy Przedsiębiorstwo A żąda dostępności produktów (składa zamówienie na zakup) od Dostawcy B.

Enterprise A i jego program działają jako klient. Magazyn jest obsługiwany przez Dostawcę B, który posiada kompleks magazynowy z bazą danych na serwerze SQL. Wymiana odbywa się za pośrednictwem korporacyjnego serwera WEB Dostawcy V.

Poniżej znajduje się następujący typowy algorytm wymiany:


Rysunek 3.
  1. Przedsiębiorstwo A inicjuje proces A(zamówienie produktu), który działa jako klient WEB.
  2. Proces A generuje dokument XML (na przykład żądanie faktury) i przesyła go jako żądanie POST http do serwera WWW dostawcy B. Jako identyfikator URI używany jest identyfikator zasobu aplikacji przetwarzającej. Identyfikator URI może być taki sam dla wszystkich typów dokumentów lub indywidualny dla każdego typu. Wszystko zależy od struktury serwera B2B (WEB).
  3. Serwer WEB analizuje żądanie i generuje serwer Proces B przekazując treść dokumentu XML jako parametr.
    Proces B jest uruchamiany przez serwer WEB i przetwarzany jako strona ASP, CGI (ISAPI) - aplikacja lub serwer JAVA (aplikacja serwerowa)
  4. Proces B- generuje żądanie do serwera bazy danych SQL.
  5. Serwer SQL wykonuje niezbędne operacje w bazie danych, generuje odpowiedź i zwraca ją Proces B.
  6. Zgodnie z odpowiedzią serwera SQL Proces B generuje dokument XML (odpowiedź) i zwraca go jako odpowiedź na żądanie http do aplikacji klienckiej.
  7. Ponadto, w zależności od sytuacji po stronie klienta, albo tworzone jest nowe żądanie http, albo sesja się kończy.

Kilka słów o organizacji obiegu dokumentów.

Ogólna zasada tworzenia systemu wymiany dokumentów XML to:

  • Najpierw- opracowanie schematu przepływu dokumentów elektronicznych i ich struktury;
  • Po drugie- opracowanie tabel funkcji procesowych (podprocesów), tj. jaką funkcję zaimplementuje każdy proces w odniesieniu do jakiego dokumentu XML.

Każdy dokument XML, podobnie jak dokument HTML, musi składać się z nagłówka wiadomości (informacji ujętych w znaczniki) i treści wiadomości (w przypadku żądania informacje te są otoczone znacznikami odpowiadającymi na żądanie). Aby dokument XML był dobrze uformowany, konieczne jest na przykład obramowanie jego dwóch części składowych „Tytuł” ​​i „Zapytanie” znacznikami. Poniżej przedstawiono typ typowego dokumentu:

Nagłówek (Rysunek 4), w przeciwieństwie do dokumentu HTML, musi zawierać różnego rodzaju informacje serwisowe, w tym informacje o rodzaju przesyłanego dokumentu i procesie jego przetwarzania. Treść dokumentu wchodzi do przetwarzania informacji, tj. treść otoczona tagami. Należy zauważyć, że struktura nagłówków powinna być taka sama dla wszystkich rodzajów dokumentów.

Dla Procesu uruchamianego przez serwer, korzystne (ale nie konieczne) jest zbudowanie algorytmu przetwarzania w następujący sposób:


Rysunek 6.

Kilka podstawowych punktów przy tworzeniu strony klienta

Jak już wyjaśniono, podczas tworzenia dokumentu XML używana jest jego reprezentacja w postaci modelu DOM. Poniżej znajduje się przykład części tekstowej Delphi programu generującego nagłówki xml wiadomości.

procedura TThread1.HeaderCreate (nadawca: obiekt); var // deklaracja klasy, potrzebna do stworzenia kodDoc: dokument CoDom; // obiekt XMLDomDocument Dokument: DomDokument; r: IXMLDOMEelement; Węzeł: IXMLDOMEelement; // DOMText txt: IXMLDOMText; // atrybut DOMAttribute: IXMLDOMAttribute; rozpocząć // utwórz dokument DOM Dokument: = coDoc.Utwórz; Doc.Set_async (fałsz); // wstępna inicjacja dokumentu DOM Doc.LoadXML ("
"); // utwórz element DOME (tag<Nadawca>) Węzeł: = Doc.createElement ("Nadawca"); // utwórz węzeł tekstowy " Tajfun LLC" txt: = Doc.createTextNode ("Tajfun LLC"); // przypisanie do węzła<Nadawca> wartość // węzeł tekstowy " Tajfun LLC" Węzeł.appendChild (txt); // dodaj element<Nadawca> do katalogu głównego jako dziecko r.appendChild (węzeł); <Z> Węzeł: = Doc.createElement ("Od"); txt: = Doc.createTextNode ("http://tayfun.ru/xml/default.asp"); Węzeł.appendChild (txt); r.appendChild (węzeł); // podobne operacje dla tagu<Do> Węzeł: = Doc.createElement ("Do"); txt: = Doc.createTextNode ("http://irbis.ru"); Węzeł.appendChild (txt); r.appendChild (węzeł); // utwórz element DOME () Węzeł: = Doc.createElement ("TypeDocument"); // utwórz węzeł XMLDOMAttribute Att: = Doc.createAttribute ("Id", "Zamówienie"); // Node.appendChild (Att); r.appendChild (węzeł); kończyć się;

Należy zauważyć, że deklaracja zmiennej coDoc: CoDomDocument oraz Doc: DomDocument, a także jej utworzenie metodą Create (Doc: = coDoc.Create;) odbywa się jednorazowo. Deklaracja zmiennej znajduje się w sekcji opisującej zmienne globalne, a nie w procedurze lokalnej, jak pokazano dla przejrzystości w tym przykładzie (czyli jedna zmienna globalna typu DomDocument na jeden moduł programu).

Efektem pracy powyższego programu będzie utworzony nagłówek, zastosowany do naszego przykładowego dokumentu xml: pokazanego na rysunku 5.


Rysunek 5.


Rysunek 6.

Główną zaletą przesyłania informacji w postaci dokumentów XML jest możliwość tworzenia wiadomości przy użyciu niezależnych struktur tabelarycznych w SZBD, zarówno po stronie odbiorczej, jak i nadawczej. Korzystając z naszego przykładu załóżmy, że wymagane jest przesłanie informacji o fakturach Przedsiębiorstwa A z SZBD o strukturze pokazanej na rysunku 6.

Aby wygenerować dokument xml zawierający fakturę, początkowo budowane jest zapytanie SQL (zapytanie A) z informacjami o samej fakturze:

WYBIERZ* Z Faktura_Ogólna GDZIE FakturaNum =: liczba WYBIERZ Towar, jakość, cena, HZ_cod Z Dobra GDZIE FakturaNum =: liczba //: num to parametr określający numer faktury.

Poniżej znajduje się część programu generująca treść dokumentu xml:

procedura TThread1.DataBodyCreate (nadawca: obiekt); var // deklaracja klasy i obiektu XMLDomDocument// coDoc: CoDomDocument; // musi być globalny dla całego modułu.// Dokument: DomDokument; // zadeklaruj obiekty DOMElement r: IXMLDOMEelement; // DOMEelement; Węzeł, Węzeł2: IXMLDOMEelement; Węzeł3, Węzeł4: IXMLDOMEelement; // DOMText txt: IXMLDOMText; ciąg: ciąg; // Numer faktury: liczba całkowita;- zmienna globalna - // ma wartość 987654 // queryA, queryB: Strunowy;- zmienna globalna, // ma wartość odpowiadającą zapytaniu // zapytanieA - zapytanie A z ogólnymi informacjami o fakturze // zapytanieB - zapytanie B informacje o towarze opisanym na // fakturze (patrz tekst) rozpocząć Zapytanie.Zamknij; // zobacz tekst "żądanie A" Zapytanie.Tekst: = zapytanieA; // wykonaj żądanie Zapytanie.ExecSQL; Zapytanie.Otwórz; // pobierz adres elementu głównego r: = Dokument.Pobierz_element_dokumentu; Węzeł2: = Doc.createElement ("Żądanie"); // utwórz element DOME (tag) Węzeł: = Doc.createElement ("Faktura"); // dodaj element do katalogu głównego r.appendChild (Node2); // dodaj element do Węzeł2. dołącz Dziecko (węzeł); // utwórz element DOME (tag) Węzeł3: = Doc.createElement ("Wycofanie"); // dodaj element do Węzeł. dołącz Dziecko (Węzeł3); // wywołanie pola "Depurture" żądania str: = Query.FieldByName ("Depurture"). AsString; // utwórz węzeł tekstowy = wartość pola// przypisz wartość do węzła // węzeł tekstowy, zmienna str Węzeł.appendChild (txt); // podobne operacje dla tagu , , // , // (pole DB „Odbiorca”) Węzeł: = Doc.createElement („Miejsce docelowe”); // nazwa pola bazy danych może nie być taka sama jak nazwa str: = Query.FieldByName ("Odbiorca") .AsString; // tag, to jest zaleta używania txt: = Doc.createTextNode (str); // DOM interfejsu przed DBMS, który obsługuje interfejs XML, // jak ORACLE 8i lub Ms SQL 2000 Węzeł.appendChild (txt); ... // generowanie zapytania o specyfikację towaru // zamknij prośbę o dostęp Zapytanie.Zamknij; // patrz w tekście "request B", info. O towarach Zapytanie.Tekst: = zapytanieВ; // przypisanie wartości parametrów Query.Params.AsInteger: = NumerFaktury; // wykonaj żądanie Zapytanie2.ExecSQL; // otwarty dostęp do żądania danych Zapytanie.Otwórz; // utwórz element DOME (tag) Węzeł3: = Doc.createElement ("Imems"); // dodaj element do Węzeł. dołącz Dziecko (Węzeł3); // pętla przez wszystkie wiersze zapytania podczas nie Eof.Zapytanie robić rozpocznij węzeł 4: = Doc.createElement ("Imem"); // dodaj element do Node3.appendChild (Node4); // tworzenie danych do tagu str: = Query.FieldByName ("Cena"). AsString; txt: = Doc.createTextNode (str); Węzeł.appendChild (txt); ... // podobne operacje dla tagów , , kończyć się; kończyć się;

W wyniku tej procedury generowany jest następujący tekst dokumentu XML:


Do utworzenia żądania wykorzystywana jest metoda Open obiektu IXMLHttpRequest:

procedura Open (const bstrMethod, - method type = "POST" bstrUrl, - Server url varAsync, - asynchronous / synchronous communication mode = true bstrUser, - nazwa użytkownika do uwierzytelniania bstrPassword) - hasło

Tworzenie strony serwerowej przetwarzania dokumentów

Jak wspomniano wcześniej, przetwarzanie żądanie HTTP mogą być implementowane przez aplikacje CGI lub serwlety Java. Możliwy jest również wariant pisania stron ASP. Ale w tym przypadku transfer danych jest możliwy tylko metodą „GET” poprzez ciąg zapytania. Jednak obsługa żądań HTTP dla stron ASP jest bardziej wydajna niż aplikacja CGI. Jednak moim zdaniem nie ma znaczenia, jak go przetwarzać, ale ważniejsze jest rozwiązanie pytania - jak zbudować program przetwarzający, a nie jakimi środkami.

Jeśli z poprzedniego rozdziału zbadaliśmy możliwości tworzenia dokumentu XML, to zadanie aplikacji serwerowej jest odwrotne – parsowanie dokumentów XML. Poniżej znajduje się część programu, który analizuje dokument xml:

procedura Tthread1.DataParser (nadawca: obiekt); var // zadeklaruj obiekty DOMElement r, FNode: IXMLDOMEelement; Str, Nazwa pliku: Ciąg; parametr: Ciąg; // deklaracja soclass i CoDocXML, CoDocXSL, CoDoc Wynik: CoDomDocument; // obiekt XMLDomDocument XMLDoc, XSLdoc, wynikowy dokument: DomDocument; // HttpStr: ciąg; - zmienna globalna zawierająca ciąg żądania HTTP Rozpocząć XMLDoc: = coDocXML.Utwórz; XMLDoc.LoadXML (HttpStr); // pobierz adres elementu głównego r: = Dokument.Pobierz_element_dokumentu; // pobierz wartość elementu FNode: = r.SelectSingleNode ("// TypeDocument"); // pobierz wartość atrybutu id = "Zamówienie" Nazwa pliku: = FNode.GetAttibute ("id"); // i utworzenie nazwy pliku Order.xsl NazwaPliku: = NazwaPliku + ".Xsl"; // utwórz dokument XSLdoc XSLDoc: = coDocXSL.Utwórz; XSLDoc.LoadXML (nazwa pliku); // utwórz dokument XMLDoc Dokument Wynikowy: = coDocResult.Create; // ustaw tryb przetwarzania synchronicznego WynikDoc.Set_async (fałsz); // ustaw sprawdzanie analizy ResultDoc.validateOnParse: = prawda; // parsowanie XMLDoc przy użyciu szablonu XSL XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); // zmiennej Str przypisana jest wartość tekstowa // wynikowego dokumentu. Ciąg: = WynikDoc.tekst; // znajdź element FNode: = r.SelectSingleNode ("// NumerFaktury"); // i pobierz wartość elementu parametr: = FNode.text; // zamknij prośbę o dostęp Zapytanie.Zamknij; Zapytanie.Tekst: = Str; // przypisanie wartości parametru Query.Params.AsString: = parametr; // wykonaj żądanie Zapytanie.ExecSQL; kończyć się;

Cała atrakcja parsowania polega na użyciu szablonu XSL, który jest generowany indywidualnie dla każdego typu dokumentu. Wynikiem parsowania jest ciąg zapytania SQL. Następnie wykonanie wygenerowanego ciągu zapytania SQL spowoduje wprowadzenie niezbędnych zmian w danych w SZBD.

Zaletą stosowania parsowania poprzez szablon jest również to, że uzyskuje się pewną elastyczność danych i uzyskuje się całkowitą niezależność algorytmu od kodu programu. Poniżej znajduje się tekst szablonu XSL używanego do przetwarzania dokumentu ZAMÓWIENIE:

INSERT do TABREG (FROM, TO, TYPEDOC, body) VALUES (" ", "", "") WSTAW DO TOWARÓW (numer faktury, nazwa, cena, jakość) WARTOŚCI (: num", " ", "", " ")

Wyjaśniając powyższy przykład, należy zauważyć, że użycie pary znaczników ma charakter formalny, ponieważ po przeanalizowaniu wynikowy dokument XML musi formalnie zawierać co najmniej jeden węzeł. Metoda ResultDoc.text przypisuje wartość tekstową ResultDoc uzyskaną podczas parsowania dokumentu XML. W tym przypadku wartością jest wszystko, co jest otoczone parą tagów i tj. zapytanie SQL, które wygenerowaliśmy.

Kolejną cechą pisania programu należy zwrócić uwagę na możliwość wykorzystania parametru SQL : licz. Użycie parametru upraszcza tekst szablonu xsl. Definicja wartości odpowiednich elementów węzłów dokumentu XML jest początkowo określana przez wybór nazwy odpowiedniego węzła, na przykład:

XSL w skrócie

Skrót XSL pochodzi od eXtensible Stylesheet Language - języka formatowania arkuszy stylów (dane XML). Jak widać z nagłówka, do formatowania danych XML używany jest eXtensible Stylesheet Language (XSL). Z definicji W3C XSL składa się z dwóch części:

  • XSLT — Transformacja XSL. Język używany do przekształcania lub formatowania (przekształcania) dokumentów XML. Tak więc za pomocą XSLT możemy uzyskać różne cięcia zestawu danych i formy prezentacji danych.
  • Elementy formatowania. Elementy te obejmują wszystkie elementy typograficzne danych, po przetworzeniu ich za pomocą XSL. Używany tylko do kształtowania Strony HTML.

Za pomocą XSLT możemy wybrać potrzebne nam dane z pliku XML i ułożyć je w formie do prezentacji użytkownikowi. Na przykład w naszym przypadku przekształciliśmy dane XML jako Zapytanie SQL... Klasycznym zastosowaniem XSL jest zwykle formatowanie danych w postaci stron HTML lub rzadziej w postaci plików RTF.

Plik XSL opisuje szablon, według którego zostanie wykonana transformacja danych XML. Wracając do szablonów xsl, w XSLT można wyróżnić następujące elementy (dyrektywy):

Dyrektywy XSL opis
xsl: zastosowanie-szablony Dyrektywa wskazująca użycie pasujących szablonów dla atrybutu select = "nazwa szablonu"
xsl: atrybut tworzy drzewo atrybutów i dodaje je do elementu wyjściowego, parametr name = "nazwa atrybutu", przestrzeń nazw to URI przestrzeni nazw (prefiks przestrzeni nazw)
xsl: szablon połączeń wywołuje szablon, nazwa atrybutu = "URI do szablonu"
xsl: wybierz
xsl: kiedy
xsl: inaczej
wybór według warunku xsl: when expr = "ocena wyrażenia w skrypcie",
język = "nazwa-języka"
test = "oceniane wyrażenie"
xsl: komentarz generuje komentarz w dokumencie wyjściowym
xsl: kopiuj
xsl: kopia
kopiuje bieżący węzeł do źródła wyjściowego lub wstawia fragment dokumentu do węzła, w którym atrybut select = "nazwa węzła źródłowego"
xsl: element tworzy element wyjściowy według nazwy, nazwa atrybutu = "nazwa elementu", przestrzeń nazw = "odwołanie do przestrzeni nazw uri"
xsl: dla każdego ponownie stosuje szablon do wszystkich węzłów z listy węzłów, atrybut select określa listę węzłów
xsl: jeśli sprawdzenie warunku, określone przez atrybut test jako wyrażenie
xsl: włącz zawiera szablon zewnętrzny, atrybut href = "referencje URI"
xsl: wyjście określa dane wyjściowe, atrybutem metody może być "xml", "html" lub "text"
xsl: param określa wartość parametrów, nazwa atrybutu = "nazwa parametru", select = "wartość"
xsl: instrukcja przetwarzania tworzy instrukcję przetwarzania, nazwa atrybutu = "nazwa procesu instrukcji"
xsl: sortuj sortuje zbiór węzłów, atrybuty select = "nazwa węzła", typ danych = typ danych ("text" | "number" | Qname), order = kierunek sortowania ("rosnąco" | "malejąco")
xsl: arkusz stylów definiuje dokument xsl-templates, jest głównym elementem XSLT
xsl: szablon definiuje szablon xsl, nazwa atrybutu = "prefiks URI do nazwy szablonu", match = "wskazanie węzła, do którego stosuje się szablon"
xsl: tekst generuje tekst do strumienia wyjściowego, atrybut disable-output-escapeing = „tak” lub „nie”, wskazuje na możliwość generowania znaków ESC
xsl: wartość-of wstawia wartość wybranego węzła jako tekst, atrybut select = "wskaźnik do węzła", z którego pobierana jest wartość
xsl: zmienna określa wartość granic zmiennej, nazwa atrybutu = "nazwa zmiennej", select = "obliczenie wartości zmiennej"
xsl: with-param stosuje parametr do szablonu, nazwa atrybutu = "nazwa parametru", select = wyrażenie do oceny bieżącego kontekstu, wartość domyślna "."

Wniosek

Na koniec należy zauważyć, że przy użyciu standardowego parsera XML msxml.dll nie jest jedynym narzędziem do parsowania i tworzenia dokumentów XML. Na przykład, aby efektywnie tworzyć dokumenty XML, użyj komponentów TPageProduser oraz TabelaProducent... Jednak ten artykuł tylko podkreśla zakres i możliwości zastosowania modelu DOM w praktyce.

Autor będzie bardzo wdzięczny za Twoją opinię na temat trafności tematu, ogólnej treści, stylu prezentacji, a także wszelkich innych komentarzy, które pomogą w dalszej poprawie jakości pisania zbioru artykułów i wydania książki, która obejmuje temat praktycznej strony wykorzystania dokumentów XML w e-commerce. Więcej dokładna informacja o praktycznej stronie korzystania z dokumentów elektronicznych można znaleźć na stronie autora www.eDocs.al.ru Również na stronie autora planowane jest umieszczenie tekstów źródłowych i przykładów.

XML jest coraz częściej używany do przechowywania informacji i wymiany ich między aplikacjami i witrynami sieci Web. Wiele aplikacji używa tego języka jako podstawowego języka do przechowywania danych, podczas gdy inne używają go do eksportowania i importowania danych XML. Nadszedł więc czas, aby programiści zastanowili się, w jaki sposób dane XML można wykorzystać w ich własnych aplikacjach.

W tym artykule przyjrzymy się XML Document Object Model (DOM) i implementacji XML DOM firmy Microsoft.

XML DOM to model obiektowy, który udostępnia programiście obiekty do ładowania i przetwarzania plików XML. Model obiektów składa się z następujących podstawowych obiektów: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap i XMLDOMParseError. Każdy z tych obiektów (oprócz XMLDOMParseError) zawiera właściwości i metody, które pozwalają uzyskać informacje o obiekcie, manipulować wartościami i strukturą obiektu oraz nawigować po strukturze dokumentu XML.

Przyjrzyjmy się głównym obiektom XML DOM i pokażmy kilka przykładów ich użycia w Borland Delphi.

Używanie XML DOM w Borland Delphi

Aby korzystać z Microsoft XML DOM w aplikacjach Delphi, należy podłączyć do projektu odpowiednią bibliotekę typów. W tym celu wykonujemy polecenie Projekt | Importuj bibliotekę typów i w oknie dialogowym Importuj bibliotekę typów wybierz bibliotekę Microsoft XML w wersji 2.0 (wersja 2.0), która zwykle znajduje się w pliku Windows \ System \ MSXML.DLL

Po kliknięciu przycisku Create Unit zostanie utworzony moduł interfejsu MSXML_TLB, który umożliwi nam korzystanie z obiektów XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest i szeregu innych, zaimplementowanych w bibliotece MSXML.DLL. Odwołanie do modułu MSXML_TLB musi znajdować się na liście zastosowań.

Urządzenie XML DOM

Document Object Model reprezentuje dokument XML w strukturze drzewiastej gałęzi. Interfejsy API XML DOM umożliwiają aplikacjom poruszanie się po drzewie dokumentów i manipulowanie jego gałęziami. Każda gałąź może mieć określony typ (DOMNodeType), zgodnie z którym określane są gałęzie nadrzędna i podrzędna. Większość dokumentów XML zawiera gałęzie typu element, atrybut i tekst. Atrybuty są specjalnym rodzajem gałęzi i nie są gałęziami podrzędnymi. Specjalne metody udostępniane przez obiekty XML DOM służą do manipulowania atrybutami.

Oprócz implementacji interfejsów zalecanych przez World Wide Web Consortium (W3C), Microsoft XML DOM zawiera metody obsługujące XSL, wzorce XSL, przestrzenie nazw i typy danych. Na przykład metoda SelectNodes umożliwia użycie składni wzorca XSL do znajdowania gałęzi w określonym kontekście, a metoda TransformNode obsługuje używanie XSL do wykonywania przekształceń.

Testuj dokument XML

Jako przykładowy dokument XML weźmy katalog CD-ROM z muzyką, który ma następującą strukturę:

Imperium burleska Bob Dylan USA Kolumbia 10.90 1985 Ukryj swoje serce Bonnie Tylor Wielka Brytania Zapisy CBS 9.90 1988 ... Uwolnij moje serce Joe cocker USA EMI 8.20 1987

Jesteśmy teraz gotowi do przyjrzenia się modelowi obiektowemu XML DOM, zaczynając od obiektu XMLDOMDocument.

Dokument XML - obiekt XMLDOMCument

Praca z dokumentem XML zaczyna się od jego załadowania. W tym celu wykorzystujemy metodę Load, która posiada tylko jeden parametr określający adres URL ładowanego dokumentu. Podczas ładowania plików z dysku lokalnego podawana jest tylko pełna nazwa pliku (można w tym przypadku pominąć protokół pliku: ///). Jeśli dokument XML jest przechowywany jako ciąg, użyj metody LoadXML, aby załadować dokument.

Właściwość Async służy do kontrolowania sposobu ładowania dokumentu (synchronicznego lub asynchronicznego). Domyślnie ta właściwość jest ustawiona na True, co oznacza, że ​​dokument jest ładowany asynchronicznie, a kontrola jest zwracana do aplikacji przed pełnym załadowaniem dokumentu. W przeciwnym razie dokument ładuje się synchronicznie, a następnie musisz sprawdzić wartość właściwości ReadyState, aby sprawdzić, czy dokument został załadowany, czy nie. Możesz również utworzyć procedurę obsługi zdarzeń dla zdarzenia OnReadyStateChange, która przejmie kontrolę, gdy zmieni się wartość właściwości ReadyState.

Poniżej pokazano, jak załadować dokument XML przy użyciu metody Load:

Używa ... MSXML_TLB ... procedury TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; rozpocznij XMLDoc: = CoDOMDocument.Create; XMLDoc.Async: = Fałsz; XMLDoc.Load („C: \ DATA \ DATA.xml”); // // Tu kod manipulujący // dokumentem XML i jego gałęziami // XMLDoc: = Nil; kończyć się;

Po załadowaniu dokumentu mamy dostęp do jego właściwości. Tak więc właściwość NodeName będzie zawierać wartość #document, właściwość NodeTypeString będzie zawierać wartość dokumentu, a właściwość URL będzie zawierać plik: /// C: /DATA/DATA.xml wartość.

Obsługa błędów

Szczególnie interesujące są właściwości związane z przetwarzaniem dokumentów przy załadunku. Na przykład właściwość ParseError zwraca obiekt XMLDOMParseError zawierający informacje o błędzie, który wystąpił podczas przetwarzania dokumentu.

Aby napisać procedurę obsługi błędów, możesz dodać następujący kod:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load (‘C:\DANE\DANE.xml’); XMLError: = XMLDoc.ParseError; Jeśli XMLError.ErrorCode<>0 Następnie // // Tutaj obsłużymy błąd // Else Memo1.Lines.Add (XMLDoc.XML); ... Dokument XML: = Brak;

Aby dowiedzieć się, jakie informacje są zwracane w przypadku błędu, zmień następujący wpis w katalogu:

Imperium burleska Bob Dylan USA Kolumbia 10.90 1985

usunięcie elementu zamykającego w drugiej linii:</p><p> <CD> <TITLE>Imperium burleska <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Kolumbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Napiszmy teraz kod, który zwraca wartości właściwości obiektu XMLDOMParseError:</p><p>XMLError: = XMLDoc.ParseError; Jeśli XMLError.ErrorCode<>0 Następnie z XMLError, Memo1.Lines zaczyna się Dodaj („Plik:” + URL); Dodaj („Kod:” + IntToStr (Kod błędu)); Dodaj („Błąd:” + Powód); Dodaj („Tekst:” + SrcText); Dodaj („Linia:” + IntToStr (Linia)); Dodaj („Pozycja:” + IntToStr (LinePos)); koniec Memo1.Lines.Add (XMLDoc.XML); Kończyć się;</p><p>i uruchom naszą aplikację. W rezultacie otrzymujemy następujące informacje o błędzie.</p> <p>Jak widać z powyższego przykładu, informacje zwracane przez obiekt XMLDOMParseError w zupełności wystarczają do zlokalizowania błędu i zrozumienia przyczyny jego wystąpienia.</p> <p>Teraz przywrócimy element zamykający <TITLE>w naszym dokumencie i kontynuuj naszą dyskusję na temat XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Dostęp do drzewa dokumentów</h2> <p>Aby uzyskać dostęp do drzewa dokumentu, możesz albo pobrać element główny, a następnie iterować po jego gałęziach podrzędnych, albo znaleźć konkretną gałąź. W pierwszym przypadku element główny uzyskujemy poprzez właściwość DocumentElement, która zwraca obiekt typu XMLDOMNode. Oto jak użyć właściwości DocumentElement, aby pobrać zawartość każdego elementu podrzędnego:</p><p>Węzeł Var: IXMLDOMNode; Korzeń: IXMLDOMEelement; I: liczba całkowita; ... Root: = XMLDoc.DocumentElement; Dla I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Memo1.Linie.Dodaj (Węzeł.Tekst); Kończyć się;</p><p>W naszym dokumencie XML otrzymujemy następujący tekst.</p> <p>Jeśli interesuje nas konkretna gałąź lub gałąź poniżej pierwszej gałęzi podrzędnej, możemy użyć metody NodeFromID lub metody GetElementByTagName obiektu XMLDOMDocument.</p> <p>Metoda NodeFromID wymaga unikalnego identyfikatora zdefiniowanego w XML Schema lub Document Type Definition (DTD) i zwraca gałąź z tym identyfikatorem.</p> <p>Metoda GetElementByTagName wymaga ciągu z określonym elementem (tagiem) i zwraca wszystkie gałęzie z tym elementem. Oto jak użyć tej metody, aby znaleźć wszystkich wykonawców w naszym katalogu CD-ROM:</p><p>Węzły: IXMLDOMNodeList; Węzeł: IXMLDOMNode; ... Węzły: = XMLDoc.GetElementsByTagName („WYKONAWCA”); Dla I: = 0 to Nodes.Length-1 do Begin Node: = Nodes.Item [I]; Memo1.Linie.Dodaj (Węzeł.Tekst); Kończyć się;</p><p>Dla naszego dokumentu XML otrzymamy następujący tekst</p> <p>Należy zauważyć, że metoda SelectNodes obiektu XMLDOMNode zapewnia bardziej elastyczny sposób uzyskiwania dostępu do gałęzi dokumentów. Ale więcej na ten temat poniżej.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Gałąź dokumentu — obiekt XMLDOMNode</h2> <p>Obiekt XMLDOMNode reprezentuje gałąź dokumentu. Napotkaliśmy już ten obiekt, gdy otrzymaliśmy główny element dokumentu:</p><p>Katalog główny: = Dokument XML.DocumentElement;</p><p>Aby uzyskać informacje o gałęzi dokumentu XML, możesz użyć właściwości obiektu XMLDOMNode (Tabela 1).</p> <p>Aby uzyskać dostęp do danych przechowywanych w gałęzi, często używa się właściwości NodeValue (dostępnej dla atrybutów, gałęzi tekstowych, komentarzy, instrukcji przetwarzania i sekcji CDATA) lub właściwości Text, która zwraca zawartość tekstową gałęzi lub właściwość NodeTypedValue. Ta ostatnia może być jednak używana tylko dla oddziałów z wpisywanymi przedmiotami.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Poruszanie się po drzewie dokumentów</h3> <p>Obiekt XMLDOMNode udostępnia wiele sposobów poruszania się po drzewie dokumentów. Na przykład, aby uzyskać dostęp do gałęzi nadrzędnej, użyj właściwości ParentNode (typ XMLDOMNode), uzyskaj dostęp do gałęzi podrzędnych poprzez właściwości ChildNodes (typ XMLDOMNodeList), FirstChild i LastChild (typ XMLDOMNode) itp. Właściwość OwnerDocument zwraca obiekt XMLDOMDocument, który identyfikuje sam dokument XML. Wymienione powyżej właściwości ułatwiają poruszanie się po drzewie dokumentów.</p> <p>Przejdźmy teraz przez wszystkie gałęzie dokumentu XML:</p><p>Katalog główny: = Dokument XML.DocumentElement; Dla I: = 0 do Root.ChildNodes.Length-1 do Begin Node: = Root.ChildNodes.Item [I]; Jeśli Node.HasChildNodes to GetChilds (Węzeł, 0); Kończyć się;</p><p>Jak wspomniano powyżej, SelectNodes obiektu XMLDOMNode zapewnia bardziej elastyczny sposób dostępu do gałęzi dokumentów. Ponadto istnieje metoda SelectSingleNode, która zwraca tylko pierwszą gałąź dokumentu. Obie te metody umożliwiają zdefiniowanie szablonów XSL dla przeszukiwania oddziałów.</p> <p>Przyjrzyjmy się procesowi wykorzystania metody SelectNodes do pobrania wszystkich gałęzi, które mają gałąź CD i podgałęź PRICE:</p><p>Katalog główny: = Dokument XML.DocumentElement; Węzły: = Root.SelectNodes („CD / CENA”);</p><p>Wszystkie podgałęzie PRICE branży CD zostaną umieszczone w kolekcji Nodes. Wrócimy do omawiania szablonów XSL nieco później.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3>Manipulowanie gałęziami potomnymi</h3> <p>Do manipulacji gałęziami potomnymi możemy użyć metod obiektu XMLDOMNode (Tabela 2).</p> <p>Aby całkowicie usunąć zapis o pierwszym dysku, musisz uruchomić następujący kod:</p><p>Var XMLDoc: IXMLDOMDocument; Katalog główny: IXMLDOMNode; Węzeł: IXMLDOMNode; Dokument XML: = Dokument CoDOM.Utwórz; XMLDoc.Async: = Fałsz; XMLDoc.Load („C: \ DATA \ DATA.xml”); // Pobierz element główny Root: = XMLDoc.DocumentElement; Węzeł: = Główny; // Usuń pierwszą gałąź podrzędną Node.RemoveChild (Node.FirstChild);</p><p>Zauważ, że w tym przykładzie usuwamy pierwszą gałąź podrzędną. Poniżej pokazano, jak usunąć pierwszy element pierwszej gałęzi podrzędnej:</p><p>Var XMLDoc: IXMLDOMDocument; Katalog główny: IXMLDOMNode; Węzeł: IXMLDOMNode; Dokument XML: = Dokument CoDOM.Utwórz; XMLDoc.Async: = Fałsz; XMLDoc.Load („C: \ DATA \ DATA.xml”); // Pobierz element główny Root: = XMLDoc.DocumentElement; // i pierwsza gałąź potomna Node: = Root.FirstChild; // Usuń pierwszą gałąź podrzędną Node.RemoveChild (Node.FirstChild);</p><p>W powyższym przykładzie usunęliśmy nie pierwszą gałąź <CD>…</CD> a pierwszym elementem gałęzi jest <TITLE>….

Dodajmy teraz nową gałąź. Poniżej znajduje się kod pokazujący, jak dodać nowy wpis na płycie CD-ROM z muzyką:

Var NewNode: IXMLDOMNode; Dziecko: IXMLDOMNode; ... // Utwórz nową gałąź - NewNode: = XMLDoc.CreateNode (1, ‘CD’, ‘’); // Dodaj element Dziecko: = XMLDoc.CreateNode (1, „TYTUŁ”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = ‘Pink Floyd’; // Dodaj element <ARTIST>Dziecko: = XMLDoc.CreateNode (1, „WYKONAWCA”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = ‘Dzwonek Podziału’; // Dodaj element <COUNTRY>Dziecko: = XMLDoc.CreateNode (1, „KRAJ”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = ‘UK’; // Dodaj element <COMPANY>Dziecko: = XMLDoc.CreateNode (1, „FIRMA”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = ‘EMI Records Ltd.’; // Dodaj element <PRICE>Dziecko: = XMLDoc.CreateNode (1, „CENA”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = '11 .99 "; // Dodaj element <YEAR>Dziecko: = XMLDoc.CreateNode (1, „ROK”, „”); // Dodaj element NewNode.AppendChild (Child); // I ustaw jego wartość Child.Text: = ‘1994’; // I dodaj gałąź Root.AppendChild (NewNode); ...</p><p>Powyższy kod pokazuje następujące kroki, aby dodać nową gałąź:</p> <ul><li>Tworzenie nowej gałęzi za pomocą metody CreateNode: <ul><li>tworzenie elementu za pomocą metody CreateNode;</li> <li>dodanie elementu do gałęzi za pomocą metody AppendChild;</li> <li>ustawienie wartości elementu poprzez właściwość Text;</li> <li>… Powtórz dla wszystkich elementów.</li> </ul></li> <li>Dodanie nowej gałęzi do dokumentu za pomocą metody AppendChild.</li> </ul><p>Przypomnij sobie, że metoda AppendChild dodaje gałąź na końcu drzewa. Aby dodać gałąź do określonego miejsca w drzewie, należy użyć metody InsertBefore.</p> <h2>Zestaw rozgałęzień — obiekt XMLDOMNodeList</h2> <p>Obiekt XMLNodeList zawiera listę gałęzi, które można zbudować za pomocą metod SelectNodes lub GetElementsByTagName, a także uzyskać z właściwości ChildNodes.</p> <p>Omówiliśmy już użycie tego obiektu w przykładzie przedstawionym w rozdziale "Poruszanie się po drzewie dokumentów". Oto kilka uwag teoretycznych.</p> <p>Liczbę rozgałęzień na liście można uzyskać jako wartość właściwości Długość. Gałęzie są indeksowane od 0 do Długość-1, a każda pojedyncza gałąź jest dostępna poprzez odpowiedni indeksowany element w tablicy Item.</p> <p>Poruszanie się po liście gałęzi można również wykonać za pomocą metody NextNode, która zwraca następną gałąź na liście, lub Nil, jeśli bieżąca gałąź jest ostatnia. Aby powrócić na początek listy, wywołaj metodę Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Twórz i zapisuj dokumenty</h2> <p>Omówiliśmy więc, jak dodawać gałęzie i elementy do istniejących dokumentów XML. Teraz stwórzmy dokument XML w locie. Przede wszystkim pamiętaj, że dokument można załadować nie tylko z adresu URL, ale także ze zwykłego ciągu znaków. Oto jak utworzyć element główny, którego można następnie użyć do dynamicznego zbudowania pozostałych elementów (co już omówiliśmy w sekcji Manipulowanie gałęziami podrzędnymi):</p><p>Var XMLDoc: IXMLDOMDocument; Katalog główny: IXMLDOMNode; Węzeł: IXMLDOMNode; S: szeroki ciąg; ... S: = ‘ <CATALOG></CATALOG>'; Dokument XML: = Dokument CoDOM.Utwórz; XMLDoc.Async: = Fałsz; XMLDoc.LoadXML (S); Katalog główny: = Dokument XML.DocumentElement; Węzeł: = XMLDoc.CreateNode (1, ‘CD’, ‘’); Root.AppendChild (węzeł); Memo1.Linie.Dodaj (XMLDoc.XML); ... Dokument XML: = Brak;</p><p>Po zbudowaniu dokumentu XML zapisz go do pliku przy użyciu metody Save. Na przykład:</p> <p>XMLDoc.Save („C: \ DATA \ NEWCD.XML”);</p> <p>Oprócz zapisywania do pliku metoda Save umożliwia zapisanie dokumentu XML w nowym obiekcie XMLDOMDocument. W takim przypadku dokument jest w pełni przetwarzany, a w efekcie sprawdzana jest jego struktura i składnia. Oto jak zapisać dokument w innym obiekcie:</p><p>Procedura TForm1.Button2Click (Nadawca: TObject); var XMLDoc2: IXMLDOMDocument; rozpocznij XMLDoc2: = CoDOMDocument.Create; XMLDoc.Zapisz (XMLDoc2); Memo2.Linie.Dodaj (XMLDoc2.XML); ... Dokument XML2: = Brak; kończyć się;</p><p>Podsumowując, metoda Save umożliwia również zapisanie dokumentu XML do innych obiektów COM, które obsługują interfejsy IStream, IPersistStream lub IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Korzystanie z szablonów XSL</h2> <p>Omawiając metodę SelectNodes obiektu XMLDOMNode wspomnieliśmy, że zapewnia ona bardziej elastyczny sposób dostępu do gałęzi dokumentów. Elastyczność polega na tym, że możesz określić szablon XSL jako kryterium wyboru oddziałów. Takie szablony zapewniają potężny mechanizm wyszukiwania informacji w dokumentach XML. Na przykład, aby uzyskać listę wszystkich tytułów muzycznych CD-ROM w naszym katalogu, możesz uruchomić następujące zapytanie:</p><p>Aby dowiedzieć się, które płyty artystów zostały wydane w Stanach Zjednoczonych, prośba jest formułowana w następujący sposób:</p><p>Węzły: = Root.SelectNodes („CD / ARTIST”);</p><p>Oto jak znaleźć pierwszy dysk w katalogu:</p><p>Węzły: = Root.SelectNodes („CD / TITLE”);</p><p>I ostatni:</p><p>Węzły: = Root.SelectNodes („CD / TITLE”);</p><p>Aby znaleźć dyski Boba Dylana, możesz uruchomić następujące zapytanie:</p><p>Węzły: = Root.SelectNodes („CD [$ dowolny $ ARTIST =” Bob Dylan ”] / TITLE”);</p><p>i aby uzyskać listę dysków zrobionych po 1985 roku, uruchamiamy następującą kwerendę:</p><p>Węzły: = Root.SelectNodes („CD / TITLE”);</p><p>Bardziej szczegółowe omówienie składni XSL wymaga osobnej publikacji. Aby zaintrygować czytelników i zachęcić do dalszych poszukiwań, podam tylko jeden mały przykład możliwego wykorzystania XSL. Powiedzmy, że musimy przekonwertować nasz katalog na zwykłą tabelę HTML. Używając tradycyjnych metod, musimy iterować po wszystkich gałęziach drzewa i dla każdego otrzymanego elementu tworzyć odpowiednie znaczniki <TD>…</TD>.</p> <p>Używając XSL, po prostu tworzymy szablon (lub arkusz stylów), który określa co i jak przekształcić. Następnie nakładamy ten szablon na nasz katalog - i to wszystko: mamy tekst szablonu XSL, który przekształca katalog w tabelę (Listing 2).</p> <p>Kod do nałożenia szablonu XSL na nasz katalog wygląda tak:</p><p>Procedura TForm1.Button2Click (Nadawca: TObject); var XSLDoc: IXMLDOMDocument; rozpocznij XSLDoc: = CoDOMDocument.Create; XSLDoc.Load ('C:\DANE\DANE.xsl'); Memo2.Text: = XMLDoc.TransformNode (XSLdoc); XSLDoc: = Brak; kończyć się;</p><p>Kończąc naszą dyskusję na temat XSL, należy stwierdzić, że obecnie język ten jest aktywnie wykorzystywany do transformacji między różnymi dokumentami XML, a także do formatowania dokumentów.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2>Wniosek</h2> <p>Z oczywistych względów niemożliwe jest omówienie wszystkich obiektów Microsoft XML DOM i podanie przykładów ich użycia w jednym artykule. Tutaj właśnie poruszyliśmy podstawowe zagadnienia związane z wykorzystaniem XML DOM w aplikacjach. Tabela 3 pokazuje wszystkie obiekty zaimplementowane w Microsoft XML DOM.</p> <p>Prasa komputerowa 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>Pobieranie rozpocznie się teraz ...</strong> <br>Nie zapomnij udostępnić materiału <br>w sieciach społecznościowych z Twoim <br>koledzy</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, Internet. Edukacja. Programy. Oprogramowanie układowe. Instalacja i konfiguracja. Nawigatorzy</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/pl/category/internet/">Internet</a> <a href="https://mkr-novo2.ru/pl/category/multimedia/">Multimedialne</a> <a href="https://mkr-novo2.ru/pl/category/navigation/">Nawigatorzy</a> <a href="https://mkr-novo2.ru/pl/category/education/">Edukacja</a> <a href="https://mkr-novo2.ru/pl/category/at/">NA</a> <a href="https://mkr-novo2.ru/pl/category/problems/">Problemy</a> </div> <div class="col-lg-2 col-sm-3 col-xs-16 links"> <h4>o projekcie</h4> <a href="">Sprzężenie zwrotne</a> <a href="">O stronie</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="">Łączność</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>Odzyskiwanie hasła <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>Wpisz swój adres e-mail, aby odzyskać hasło!</p> <div class="input-wrp"> <input name="email" type="text" placeholder="Wprowadź swój email"> </div> <input type="submit" data-disable-with="Отправить..." class="btn green" value="wysłać"> </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>