|
|
pl:miw:miw08_prolog_xml [2008/06/05 22:19] miw |
pl:miw:miw08_prolog_xml [2019/06/27 15:50] |
====== 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 ====== | |
[[pl:miw:miw08_prolog_xml:spotkania|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: | |
<code 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> | |
</code> | |
| |
Przetestowano następujące implementacje prologu: SWI-Prolog, BProlog, Amzi! Prolog, MINERVA, JIProlog oraz YAP Prolog. | |
| |
| |
| |
==== SWI-Prolog ==== | |
| |
SWI-Prolog posiada pakiet //**sgml2pl**// - [[http://www.swi-prolog.org/packages/sgml2pl.html|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: | |
<code prolog> | |
?- load_xml_file('cd.xml',T). | |
</code> | |
otrzymano: | |
<code prolog> | |
T = [element('CD', [], [ | |
element('TITLE', [], ['Empire Burlesque']), | |
element('ARTIST', [], ['Bob Dylan']), | |
element('COUNTRY', [], ['USA']), | |
element('COMPANY', [], ['Columbia']), | |
element('PRICE', [], ['10.90']), | |
element('YEAR', [], [...]), | |
element(..., ..., ...)|...])] | |
</code> | |
W celu przetworzenia z powrotem postaci prologowej do postaci XML wpisujemy: | |
<code prolog> | |
?- load_xml_file('cd.xml',L),tell('cd1.xml'),open('cd1.xml',write,S),xml_write(S,L,[]),told,close(S). | |
</code> | |
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: | |
- 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'. | |
- Komenda //**cl(File)**// kompiluje i ładuje program, np. //**cl('xml.pl')**// kompiluje i ładuje bibliotekę 'xml.pl'. | |
- 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: | |
<code prolog> | |
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")] ) | |
] ) | |
] ). | |
</code> | |
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:[[http://www.amzi.com/manuals/amzi7/libs/xml.htm|XML.pro]]. | |
Niestety nie udało sie skorzystać z wyżej wymienionej biblioteki. | |
| |
| |
| |
| |
| |
==== 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. | |
| |
Podstawowymi predykatami związanymi z parsowaniem i przetwarzaniem dokumentów XML są: | |
* //**read_xml(XmlStream, XmlTerm)**// - parsowanie pliku XML do postaci prologowej. | |
* //**write_xmlfile(Filename, XmlTerm)**// - przetwarzanie postaci prologowej do pliku XML. | |
| |
Niestety nie przetestowano użycia wyżej wymienionych predykatów. Patrząc jednak na przykłady udostępnione na stronie domowej MINERVY funkcjonalności zaproponowane przez ten produkt nie różnią się od tych użytych np. w SWI-Prolog. | |
| |
Przykładem może być wygenerowana prologowa struktura dokumentu XML po sparsowaniu dokumentu korzystając z predykatu //**read_xml(XmlStream, XmlTerm)**//. | |
| |
<code prolog> | |
document([xml([version = '1.0'])], | |
element(addressbook,[],[ | |
element(address,[telno = '1234567'],[ | |
element(name,[],[chardata('John')]), | |
element(age,[],[chardata('35')])]), | |
element(address,[telno = '3456789',email = 'henriette@ifcomputer.com'],[ | |
element(name,[],[chardata('Henriette')]), | |
element(age,[],[chardata('27')])])]),[]) | |
</code> | |
| |
| |
| |
| |
| |
| |
==== JIProlog ==== | |
JIProlog jest bezpłatnym interpreterem prologu integrującym języki Java i Prolog. Podczas działania wyświetla się tylko napis informujący użytkownika, że posiada wersje shareware unregistered. JIProlog posiada bibliotekę //**jipxxml**// do obsługi plików XML zgodnych z modelem DOM. Podstawowymi predykatami służącymi do parsowania i przetwarzania plików XML są | |
* //**xml_read_document(X)**// - parsowanie dokumentu XML do postaci prologu | |
* //**xml_write_document(XMLDoc)**// - przetwarzanie postaci prologowej do pliku XML | |
| |
Aby sparsować dokument XML należy kolejno: | |
- Załadować bibliotekę do obsługi XML - //**load_library('jipxxml.jar').**// | |
- Załadować bibliotekę do obsługi input/output plików - //**load_library('jipxio.jar').**// | |
- Otworzyć dokument XML - //**see('cd.xml').**// | |
- Użyć predykatu: //**xml_read_document(X)**// | |
| |
Poniżej przedstawiono wygenerowany plik w postaci prologowej: | |
<code prolog> | |
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)]) | |
])) | |
</code> | |
| |
JIProlog posiada również szereg predykatów związanych z budowaniem plików XML zgodnych z modelem DOM. Najważniejszymi predykatami są: | |
* xml_element(Name, Attributes, Children, ElementTerm) - tworzenie węzła, obiektu typu element | |
* xml_attribute(Name, Value, AttributeTerm) - tworzenie obiektu typu atrybut | |
* xml_text(Content, TextTerm) - tworzenie obiektu typu Text | |
* xml_append_child(Child, Element, NewElement) - dodawanie dziecka | |
* xml_append_attribute(Attribute, Element, NewElement) - dodawanie atrybutu | |
* xml_document(Version, Encoding, DocType, Root, DocumentTerm) - tworzenie obiektu typu Dokument XML | |
| |
Poniżej zamieszczono przykład budowania prostego pliku XML z użyciem wyżej wymienionych predykatów: | |
<code prolog> | |
create_xml_file(X):- | |
tell(X), | |
% create root element | |
xml_element('music_shop', [], [], Root), | |
% create child 1n | |
xml_element('cd', [], [], Cd1), | |
%create attributes | |
xml_attribute('artist', 'Bob Dylan', Att1), | |
xml_attribute('title', 'Empire Burlesque', Att2), | |
xml_attribute('price', '10.90', Att3), | |
% append attributes | |
xml_append_attribute(Att1, Cd1, Cd11), | |
xml_append_attribute(Att2, Cd11, Cd12), | |
xml_append_attribute(Att3, Cd12, Cd13), | |
% create child | |
xml_text('Music CD', Title1), | |
% append child | |
xml_append_child(Title1, Cd13, Cd14), | |
% append children to root | |
xml_append_child(Cd14, Root, Root1), | |
% create document | |
xml_document('1.0', [], [], Root1, Doc), | |
xml_write_document(Doc), | |
told. | |
</code> | |
| |
==== 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) - [[http://www.clip.dia.fi.upm.es/Software/pillow/pillow.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 [[http://www.clip.dia.fi.upm.es/Software/pillow/pillow_doc_html/pillow_doc_3.html#SEC5|xml2terms/2]] | |
| |
Predykat ten wykorzystuje się na dwa sposoby: | |
- translacja XML-term do kodu XML | |
- 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ę [[pl:miw:miw08_prolog_xml:projekt|tutaj]]. | |
| |
| |
| |
| |
| |
====== Materiały ====== | |
| |
Wszelkie materiały dostępne: [[pl:miw:miw08_prolog_xml:materialy|tutaj]]. | |