PDA

View Full Version : [JAVA] Parser DTD


Dostybear
01-05-2007, 10:28
Ciao!
Devo realizzare in Java una classe che possa analizzare un file contenente la descrizione di un DTD xml, e che quindi riesca a identificare i nomi di elementi e attributi per poi inserirli in una struttura già definita in un'altra classe. Il problema è che non so da dove iniziare per fare il parsing del documento.
Ogni suggerimento è ben accolto :) grazie in anticipo!

akyra
02-05-2007, 08:55
beh....diciamo che stai citando circa un oceano di concetti...prima di tutto costruire un parser non è una cosa semplicissimissima. Hai detto che il lunguaggio usato è xml, che è un linguaggio libero dal contesto definito da una grammatica LR(k), cioè a derivazioni right-most con k simboli di lookahead...
magari questi concetti non ti serviranno, però per lo meno dovresti sapere che lo scopo di un parser è quello di costruire un albero di parsing, cioè un albero che sia in grado di descrivere la struttura sintattica di ogni frase del linguaggio. Per fare ciò con ogni probabilità dovrai costruirti un automa a stati finiti deterministico in grado di riconoscere ogni stringa che fa parte del linguaggio...
dovresti essere più preciso, e dirmi magari quali siano le possibili limitazioni del progetto che devi fare, in modo da evitare di farti perdere tempo su concetti che non ti servono...

intanto magari ti invio questo link

http://www.latoserver.it/java/parsing-XML/

spero possa esserti utile ai fini di quello che (penso) tu debba fare

^TiGeRShArK^
02-05-2007, 10:26
spè..
la devi realizzare tu per forza per qualche progetto dell'univ o puoi anke usare librerie già esistenti..
perchè di librerie per la validazione degli xml con una dtd ce ne stanno a bizzeffe :mbe:

Dostybear
02-05-2007, 16:21
Si, forse sono stato un pò troppo vago :p
Allora, innanzitutto devo realizzarlo io senza utilizzare librerie esterne; lo scopo non è quello della validazione dell'xml, ma più semplicemente deve riuscire a identificare i nomi di elementi ed attributi e le relazioni tra i diversi elementi. Al link avevo già dato un'occhiata, ma nel mio caso dovrei analizzare il contenuto di un dtd, non di un documento xml.
Per fare un esempio dal dtd seguente
<!ELEMENT impiegati (impiegato)*>
<!ELEMENT impiegato (nome, email, url?)>
<!ATTLIST impiegato id CDATA #REQUIRED>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT url EMPTY>
<!ATTLIST url href CDATA #REQUIRED>
a me interessa sapere che ci sono 4 elementi, con i loro nomi; che impiegati è composto da impiegato che a sua volta è composto da nome, email e url; inoltre che url ha un attributo href.

Dostybear
04-05-2007, 08:11
Up!

akyra
04-05-2007, 09:13
Si, forse sono stato un pò troppo vago :p
Allora, innanzitutto devo realizzarlo io senza utilizzare librerie esterne; lo scopo non è quello della validazione dell'xml, ma più semplicemente deve riuscire a identificare i nomi di elementi ed attributi e le relazioni tra i diversi elementi. Al link avevo già dato un'occhiata, ma nel mio caso dovrei analizzare il contenuto di un dtd, non di un documento xml.
Per fare un esempio dal dtd seguente
<!ELEMENT impiegati (impiegato)*>
<!ELEMENT impiegato (nome, email, url?)>
<!ATTLIST impiegato id CDATA #REQUIRED>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT url EMPTY>
<!ATTLIST url href CDATA #REQUIRED>
a me interessa sapere che ci sono 4 elementi, con i loro nomi; che impiegati è composto da impiegato che a sua volta è composto da nome, email e url; inoltre che url ha un attributo href.

quello che devi costruirti è un automa a stati finiti deterministico che faccia l'analisi lessicale del DTD....se non hai idea di cosa stia dicendo devi prima documentarti su questo....però mi sembra molto strano che tu debba costruirti un algoritmo del genere senza avere nozioni di questo tipo...

Dostybear
04-05-2007, 09:20
Nono, so di cosa stai parlando. Però pensavo che, visto che lo comunque scopo è piuttosto semplice (non devo certo scrivere un compilatore:) ), ci potesse essere qualche modo più veloce per realizzarlo.
Ora ho provato a buttar giù una classe per dividere in token il file di testo (il dtd) in input.

akyra
04-05-2007, 09:50
magari puoi evitare di scrivere un analizzatore lessicale complicato se fai delle ipotesi molto forti sul DTD che devi analizzare....ma devono essere proprio forti, e quello che ne uscirebbe sarebbe abbastanza grezzo e poco dinamico...
ad esempio se ipotizzi che dopo "<!ELEMENT" ci sia uno spazio vuoto e il nome dell'elemento, allora puoi usare le funzioni sulle stringhe che tagliano/cercano sottostringhe all'interno di altre stringhe...così, ad esempio ti verrebbe un codice del tipo:

se la riga letta inizia per "<!ELEMENT" allora taglia "<!ELEMENT" dalla stringa, e memorizza la stringa successiva racchiusa da due spazi vuoti (il nome dell'elemento)
quindi trova gli eventuali attributi tra parentesi, divisi da virgole

questo pseudo-ridicolo-codice dovrebbe renderti l'idea...

Dostybear
04-05-2007, 11:16
Inizialmente pensavo proprio a una soluzione del genere...ora mi hai messo qualche dubbio:confused:
Ma per costruire un analizzatore lessicale non dovrei comunque basarmi sul riconoscimento delle stringhe?

akyra
04-05-2007, 14:50
beh ma quello che ho scritto io non è un abbozzo di analizzatore lessicale, è più che altro una manipolatore di stringhe.
Quello che intendevo dire io è che, se devi costruirti l'analizzatore lessicale, allora devi considerare TUTTI i costrutti possibili del linguaggio e procedere di conseguenza: leggere un carattere alla volta e prendere le relative decisioni

hai letto "<", allora portati in un certo stato che si aspetta come prossimo carattere un "!", quindi leggi sto benedetto "!", se poi arriverà un "E" cambia lo stato e passa ad uno specifico che riconosce la stringa "ELEMENT", se invece arriva "A" passa ad uno stato in grado di riconoscere "ATTLIST"....e così via

come puoi capire questo è molto più prolisso e complicato in quanto devi costruire l'analizzatore lessicale, in modo che riconosca tutti i possibili costrutti del DTD....ad esempio se dopo aver letto "<!" compare una "U" inaspettata, l'analizzatore deve essere in grado di eseguire un azione...magari notificando l'errore di sintassi...

nell'altro modo invece fai delle ipotesi forti sul DTD che vai ad analizzare, cioè ipotizzi che gli elementi "<!ELEMENT" siano SEMPRE seguiti da uno spazio vuoto a cui segue l'identificatore cercato...ma se ti capita un DTD che non rispetta questa ipotesi, naturalmente il programma non funzionerà....hai capito?

Dostybear
04-05-2007, 15:29
Si, sei stato chiarissimo.
In effetti non dovrebbe importarmi molto che il dtd sia scritto come si deve, cioè posso presumere che lo sia, e quindi fare tutte le manipolazioni necessarie di conseguenza.
Ti ringrazio per la pazienza:)