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, 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. 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).

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')])])]),[])

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.1212683853.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