JavascriptProva

lunedì 22 ottobre 2012

Elementi XML: dichiarazione del numero dei figli

La logica dell'XML è ferrea, a quanto pare!
Ho un file XML di questo genere:
<!DOCTYPE documento [
<!ELEMENT documento (capitolo)>
<!ELEMENT capitolo (#PCDATA)>
]>
<documento>
 <capitolo>
 "ciao merdaccia"
 </capitolo>
</documento> 
E con il codice javaScript:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.load("prova.xml");
var root = xmlDoc.documentElement;
alert(root.getElementsByTagName("capitolo")[0].text);
...riesco a caricarlo e a ottenere, come fatto prima, il messaggio "ciao merdaccia".
Adesso provo ad aumentare il numero degli elementi %lt;controllo> nel file XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE documento [
<!ELEMENT documento (capitolo)>
<!ELEMENT capitolo (#PCDATA)>
]>
<documento>
 <capitolo>
 "ciao merdaccia"
 </capitolo>
 <capitolo>
 "ciao deficiente"
 </capitolo>
</documento> 
...e con quel codice javaScript non ottengo nulla, ma il debugger mi dà il messaggio di errore:
Impossibile ottenere il valore della proprietà 'getElementsByTagName': 
oggetto nullo o non definito


Perchè?

L'ho scoperto subito: perchè quando io specifico i figli dell'elemento <documento> uso la seguente sintassi:
<!ELEMENT documento (capitolo)>
che significa che l'elemento documento ha un solo figlio, mentre poi, di fatto, ne ha due.

Allora metto il simbolo +, che significa "uno o più figli":
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE documento [
<!ELEMENT documento (capitolo+)>
<!ELEMENT capitolo (#PCDATA)>
]>
<documento>
 <capitolo>
 "ciao merdaccia"
 </capitolo>
 <capitolo>
 "ciao deficiente"
 </capitolo>
</documento> 
e ottengo di nuovo l'insulto di prima, regolarmente, perchè adesso si specifica che i figli dell'elemento documento possono essere uno o più.
Adesso uso il simboletto ? che significa "zero o uno figli".
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE documento [
<!ELEMENT documento (capitolo?)>
<!ELEMENT capitolo (#PCDATA)>
]>
<documento>
 <capitolo>
 "ciao merdaccia"
 </capitolo>
 <capitolo>
 "ciao deficiente"
 </capitolo>
</documento> 
e non ottengo niente, perchè qui i figli sono due!
Provo infine a usare il simboletto *, che significa "zero o più":
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE documento [
<!ELEMENT documento (capitolo*)>
<!ELEMENT capitolo (#PCDATA)>
]>
<documento>
 <capitolo>
 "ciao merdaccia"
 </capitolo>
 <capitolo>
 "ciao deficiente"
 </capitolo>
</documento> 
E ottengo il mio caro "ciao merdaccia", oppure, se chiedo il contenuto del secondo elemento:
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.load("prova.xml");
var root = xmlDoc.documentElement;
alert(root.getElementsByTagName("capitolo")[1].text);
ottengo un meraviglioso "ciao deficiente"!
Nonostante gli insulti, sono contento!!!

Nessun commento:

Posta un commento