PDA

View Full Version : [XML/DTD] elementi con lo stesso nome ma con parentele diverse


superciccio14
13-04-2010, 09:18
Ciao a tutti è possibile trattare tag XML che hanno lo stesso nome ma sono figli di elementi diversi?

Ad esempio:

<oraEntrata>
<h>5</h>
<m>45</m>
</oraEntrata>
<oraUscita>
<h>6</h>
<m>40</m>
</oraUscita>


Il mio dubbio è: nel dtd come descrivo sta roba? Potrei fare:

<!ELEMENT oraEntrata(h,m)>
<!ELEMENT h (#PCDATA)>
<!ELEMENT m (#PCDATA)>
<!ELEMENT oraUscita(h,m)>
<!ELEMENT h (#PCDATA)>
<!ELEMENT m (#PCDATA)>

ma non c'è confusione sulla parentela di h ed m? Non sono ridondanti? Se dovessi ad esempio specificare un attributo per la prima m:

<!ELEMENT oraEntrata(h,m)>
<!ELEMENT h (#PCDATA)>
<!ELEMENT m (#PCDATA)>
<!ATTLIST m bollatrice CDATA #REQUIRED>
<!ELEMENT oraUscita(h,m)>
<!ELEMENT h (#PCDATA)>
<!ELEMENT m (#PCDATA)>

Non ci sarebbe confusione? Questo accade se il DTD tiene conto dell'ordine con cui gli dichiari gli elementi, credo...

Ciao e Grazie

kk3z
13-04-2010, 15:02
http://bytes.com/topic/net/answers/85747-dtd-question-surrounding-duplicate-child-elements

superciccio14
13-04-2010, 16:21
Ti ringrazio. Quindi la mia impressione era giusta? Il documento può essere valido ma non verificato con un DTD :(

Sbrizzolo86
13-04-2010, 18:00
Forse la mia domanda è stupida, ma non puoi fare così?


<!ELEMENT oraEntrata (h,m)>
<!ELEMENT oraUscita (h,m)>
<!ELEMENT h (#PCDATA)>
<!ELEMENT m (#PCDATA)>

In questo modo non c'è alcuna ambiguità e puoi verificare l'xml con il DTD. A meno che tu non abbia espressamente l'esigenza di differenziare <h><m> tra entrata e uscita, in questo caso il mio consiglio non ti servirà.

Alessandro

superciccio14
15-04-2010, 08:18
Ciao Sbrizzolo. Sì il tuo consiglio è ok, ma funziona solo nel caso un cui h ed m siano #PCDATA.

Se, per dire, h ed m sono una volta un tipo semplice, un'altra un tipo complesso il DTD non mi offre l'espressività necessaria a definire la struttura. Penso che sia così!

Sbrizzolo86
15-04-2010, 09:11
Ciao Sbrizzolo. Sì il tuo consiglio è ok, ma funziona solo nel caso un cui h ed m siano #PCDATA.

Se, per dire, h ed m sono una volta un tipo semplice, un'altra un tipo complesso il DTD non mi offre l'espressività necessaria a definire la struttura. Penso che sia così!

Sì ma infatti se li devi differenziare, come ho detto, il mio consiglio è inutile.

Solo che mi chiedo: se li devi differenziare, perchè chiamarli con lo stesso nome? Visto che si gioca tutto con il 'nome' appunto, che è l'identificativo nel DTD, e visto anche che sono 'diversi', a questo punto vale la pena chiamarli in maniera diversa.

Ad esempio se ce ne sono due tipi (ma si può estendere ad n tipi):

<!ELEMENT oraEntrata (h1,m1)>
<!ELEMENT h1 (#PCDATA)>
<!ELEMENT m1 (#PCDATA)>
<!ELEMENT oraUscita (h2,m2)>
<!ELEMENT h2 (#PCDATA)>
<!ELEMENT m2 (#PCDATA)>

dove ovviamente puoi personalizzare a piacere tutti i tag h,m.

Non so se mi sono spiegato bene, ma a me questo non sembra un limite del DTD/XML, quanto piuttosto una questione mal posta. Di solito, in informatica, se devo differenziare due oggetti nella loro struttura, li dichiaro con nomi diversi, tutto qua!;)

Alessandro

superciccio14
15-04-2010, 09:18
Certo! Difatti sono d'accordissimo con te. Ma non è un mio prodotto :/ ahimè