To jest stara wersja strony!


Opis

Wojciech Szymański wojtek.szym@gmail.com

Omówić metody parsowania, generowania i przetwarzania XML/SGML w Prologu. Należy również zająć się reprezentacjami pochodnymi opartymi na XML, np. RDF.

Porównać dostępne rozwiązania i implementacje, np:

  • SWI
  • inne, np. YAP, Amzi.

Wsparcie dla

  • XSD
  • namespaces
  • XSL
  • DOM

Spotkania

Sprawozdanie

Wstęp - ogólne informacje

Celem projektu było omówienie metod parsowania, generowania oraz przetwarzania XML/SGML w Prologu. Należało porównać i przetestować dostępne rozwiązania oraz sprawdzić czy posiadają wsparcie dla DOM, XSD, XSL oraz namespaces. Istotną częścią projektu była implementacja własnego API przeznaczonego do tworzenia dokumentów XML w SWI-Prolog. Okazało się bowiem, że dostępne rozwiązania posiadają przede wszystkim dobre mechanizmy parsowania dokumentu (tworzenia postaci prologowej) oraz jego przetwarzania - zamiany postaci prologowej na dokument XML, natomiast nie posiadają wsparcia dla generowania XML opartego o standard DOM.

Parsowanie i przetwarzanie prostych dokumentów XML w prologu

Istnieje wiele implementacji prologu posiadających wsparcie dla generowania i przetwarzania dokumentów XML. Dostępne są zarówno wersje płatne, które można przetestować (np. 30-dniowe wersje) oraz wersje bezpłatne.

W celu przetestowania parsowania oraz przetwarzania plików XML przygotowano następujący, prosty plik XML:

<CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tylor</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
    <TITLE>Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
    <TITLE>Still got the blues</TITLE>
    <ARTIST>Gary More</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>Virgin redords</COMPANY>
    <PRICE>10.20</PRICE>
    <YEAR>1990</YEAR>

Przetestowano następujące implementacje prologu: SWI-Prolog, BProlog, Amzi! Prolog, EZY Prolog, MINERVA, JIProlog oraz YAP Prolog.

SWI-Prolog

SWI-Prolog posiada pakiet sgml2pl - SWI-Prolog SGML/XML parser. Pakiet ten posiada możliwości parsowania dokumentów XML wraz z namespaces oraz plików XML opartych o model DOM. Podstawowym predykatem służącym do parsowania jest: load_xml_file(+File,-ListOfContents). Natomiast predykat służący do przetworzenia postaci prologowej na postać xml ma postać: xml_write(+Stream, +Term, +Options).

Po wpisaniu w prologu:

?- load_xml_file('cd.xml',T).

otrzymano:

T = [element('CD', [], [
element('TITLE', [], ['Empire Burlesque']), 
element('ARTIST', [], ['Bob Dylan']), 
element('COUNTRY', [], ['USA']), 
element('COMPANY', [], ['Columbia']), 
element('PRICE', [], ['10.90']), 
element('YEAR', [], [...]), 
element(..., ..., ...)|...])]

W celu przetworzenia z powrotem postaci prologowej do postaci XML wpisujemy:

?- load_xml_file('cd.xml',L),tell('cd1.xml'),open('cd1.xml',write,S),xml_write(S,L,[]),told,close(S).

i otrzymujemy dokument XML o nazwie cd1 stanowiący kopię dokumentu cd.xml (Dokument został sparsowany, a następnie zapisany do pliku o nowej nazwie ).

BProlog

Implementacja BProlog posiada bibliotekę o nazwie xml.pl. Podstawowym predykatem do parsowania plików XML jest: xml2pl(Input,Output). Jako parametr Input podajemy plik XML, a jako Output - plik, w którym chcemy zapisać prologową strukturę XML. Poniżej przedstawiono kroki w celu otrzymania struktury XML:

  1. Komenda cd(Dir) ustala ścieżkę, w której pracujemy, np. cd('C:/BProlog/Tools'). Tam muszą więc znajdować sie zarówno pilik XML jak i plik biblioteki 'xml.pl'.
  2. Komenda cl(File) kompiluje i ładuje program, np. cl('xml.pl') kompiluje i ładuje bibliotekę 'xml.pl'.
  3. Dalej posługujemy się predykatem, np. xml2pl('cd.xml','nowy.pl') tworzy plik nowy.pl zawierający postać prologową pliku cd.xml.

Poniżej przedstawiono wygenerowaną postać w prologu:

xml( [version="1.0", encoding="ISO-8859-1", standalone="no"],
	[
	doctype( 'CD', system( "cd.dtd" ) ),
	element( 'CD',
		[],
		[
		element( 'TITLE',[],[pcdata("Empire Burlesque")] ),
		element( 'ARTIST',[],[pcdata("Bob Dylan")] ),
		element( 'COUNTRY',[],[pcdata("USA")] ),
		element( 'COMPANY',[],[pcdata("Columbia")] ),
		element( 'PRICE',[],[pcdata("10.90")] ),
		element( 'YEAR',[],[pcdata("1985")] ),
		element( 'TITLE',[],[pcdata("Hide your heart")] ),
		element( 'ARTIST',[],[pcdata("Bonnie Tylor")] ),
		element( 'COUNTRY',[],[pcdata("UK")] ),
		element( 'COMPANY',[],[pcdata("CBS Records")] ),
		element( 'PRICE',[],[pcdata("9.90")] ),
		element( 'YEAR',[],[pcdata("1988")] ),
		element( 'TITLE',[],[pcdata("Greatest Hits")] ),
		element( 'ARTIST',[],[pcdata("Dolly Parton")] ),
		element( 'COUNTRY',[],[pcdata("USA")] ),
		element( 'COMPANY',[],[pcdata("RCA")] ),
		element( 'PRICE',[],[pcdata("9.90")] ),
		element( 'YEAR',[],[pcdata("1982")] ),
		element( 'TITLE',[],[pcdata("Still got the blues")] ),
		element( 'ARTIST',[],[pcdata("Gary More")] ),
		element( 'COUNTRY',[],[pcdata("UK")] ),
		element( 'COMPANY',[],[pcdata("Virgin redords")] ),
		element( 'PRICE',[],[pcdata("10.20")] ),
		element( 'YEAR',[],[pcdata("1990")] )
		] )
	] ).

Do przetworzenia postaci prologowej na dokument XML służy predykat: pl2xml(Document,Codes).

Amzi! Prolog

Wersja prologu Amzi! jest możliwa do ściągnięcia jako wersja „Free (Never Expires)”. Za inne wersje trzeba płacić. Amzi! Prolog posiada bibliotekę obsługującą pliki XML:XML.pro.

EZY Prolog

Udało sie zainstalować EZY Prolog Suite. Jest to wersja darmowa tzw. EZY Prolog for students. Przetestowano program ezy_zml_laboratory.ezy. Program pozwala na wczytanie pliku xml i jego sparsowanie.

MINERVA

Minerva jest licencjonowanym produktem firmy IF Computer Japan. Jest możliwe posiadanie licencji ewaluacyjnej (wolnej od opłaty) ważnej na okres 2 miesięcy. Minerva może być nazwana jako Java Prolog ponieważ dostarcza funkcjonalności Prologu jako klasa Javy.

JIProlog

Po zainstalowaniu i uruchomieniu lub po uruchomieniu apletu na stronie parser zadziałał. Wersja tego prologu była bezpłatna, podczas działania wyświetlał sie tylko napis informujący użytkownika, że posiada wersje shareware unregistered. Zgodnie z przykładem udało sie otrzymać postać prologową po sparsowaniu pliku xml. Poszczególne kroki:

  • load_library('jipxxml.jar'). - ładowanie biblioteki do obsługi plików xml
  • load_library('jipxio.jar'). - ładowanie biblioteki do i/o dla plików
  • see('cd.xml'). - otworzenie pliku xml
  • xml_read_document(X) - przetworzenie dokumentu xml do postaci prologu

Istnieje też predykat create_xml_file(X) który zawarty jest w przykładowym programie xml_sample.pl. Predykat ten tworzy plik xml na podstawie termu prologowego. Istnieje też predykat xml_write_document(Handle,Term).

Poniżej przedstawiono wygenerowany plik w postaci prologowej:

X = xml_document([[version = 1.0, encoding = UTF-8], 
xml_doctype(CD, [SYSTEM = cd.dtd], [])], 
xml_element(CD, [], 
[xml_element(TITLE, [], [xml_text(Empire Burlesque)]), 
xml_element(ARTIST, [], [xml_text(Bob Dylan)]), 
xml_element(COUNTRY, [], [xml_text(USA)]), 
xml_element(COMPANY, [], [xml_text(Columbia)]), 
xml_element(PRICE, [], [xml_text(10.90)]), 
xml_element(YEAR, [], [xml_text(1985)]), 
xml_element(TITLE, [], [xml_text(Hide your heart)]), 
xml_element(ARTIST, [], [xml_text(Bonnie Tylor)]), 
xml_element(COUNTRY, [], [xml_text(UK)]), 
xml_element(COMPANY, [], [xml_text(CBS Records)]), 
xml_element(PRICE, [], [xml_text(9.90)]), 
xml_element(YEAR, [], [xml_text(1988)]), 
xml_element(TITLE, [], [xml_text(Greatest Hits)]), 
xml_element(ARTIST, [], [xml_text(Dolly Parton)]), 
xml_element(COUNTRY, [], [xml_text(USA)]), 
xml_element(COMPANY, [], [xml_text(RCA)]), 
xml_element(PRICE, [], [xml_text(9.90)]), 
xml_element(YEAR, [], [xml_text(1982)]), 
xml_element(TITLE, [], [xml_text(Still got the blues)]), 
xml_element(ARTIST, [], [xml_text(Gary More)]), 
xml_element(COUNTRY, [], [xml_text(UK)]), 
xml_element(COMPANY, [], [xml_text(Virgin redords)]), 
xml_element(PRICE, [], [xml_text(10.20)]), 
xml_element(YEAR, [], [xml_text(1990)])
]))

YAP Prolog

Wersja YAP Prolog jest bezpłatna użyciu w środowiskach akademickich. Istnieje biblioteka posiadająca możliwości związane z plikami XML/HTML (parsowanie plików XML lub HTML) - The PiLLoW Web Programming Library .

Wersje tej biblioteki są dostępne zarówno dla YAP Prolog jak i dla SWI Prolog oraz Ciao Prolog.

Jeśli chodzi o predykaty związane z XML jest dostępny xml2terms/2

Predykat ten wykorzystuje się na dwa sposoby:

  1. translacja XML-term do kodu XML
  2. translacja kodu XML do strukturalnego termu XML'owego

Porównanie prologowych postaci dokumentu XML

Implementacja API w SWI-Prolog

Przykład użycia API

Projekt

Przebieg projektu znajduje się tutaj.

Materiały

Wszelkie materiały dostępne: tutaj.

pl/miw/miw08_prolog_xml.1212682666.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0