org.w3c.dom
:http://java.sun.com/j2se/1.5.0/docs/api/org/w3c/dom/package-summary.html
javax.xml.parsers
: http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/package-summary.html
javax.xml.transform
:NS
,
qui se
réfèrent aux noms munis d'un préfixe de namespace.org.w3.dom.Element
,getAttribute(String
name)
est doublée de
getAttributeNS(String namespaceURI,
String localName).
<elem
xmlns:pref="http://monDomaine.monEspace"
pref:monAtt="maValeur">...
getAttribute("pref:monAtt")
- avec le nom préfixé complet - et
getAttributeNS(
"http://monDomaine.monEspace"
,
"monAtt"
)
"maValeur"
.DocumentBuilder
)
qui l'a produit, DocumentBuilderFactory
qui l'a créé le lui a dit,DocumentBuilderFactory::setNamespaceAware
déclare :DocumentBuilderFactory
dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Element
en question sera souvent obtenu par un procédé Node
générique (par
exemple, par getFistChild()
, ou à partir
d'une NodeList
).Element
,
il faudra donc effectuer une coercion (casting)
explicite,Element elt = (Element) autre.getFistChild();
Node
obtenu se trouve être un Text
!com.sun.org.apache.xerces.internal.dom.DeferredTextImpl
cannot be cast to org.w3c.dom.Element
Erreur com.sun.org.apache.xerces.internal.dom.DeferredTextImpl
Voir plus loin un remède possible.
if( enfant.getNodeType() == Node.ELEMENT_NODE ){Sur le cas particulier fréquent d'un enfant qui est de type
Element e = (Element) enfant;
..............
}else{ // c'est un texte
Text t = (Text) enfant;
..........
}
Text
,
voir plus loin.Node
,
voir la Javadoc :http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/Node.html
NodeList
sont vivants ! Toute modification à l'arbre y est immédiatement répercutée.<?xml version="1.0"?>Du point de vue sémantique, de tels Elements sont des feuilles de l'arbre
<liste>
<eleve nom='Pierre'> <note> 12 </note>
</eleve>
<eleve nom="Paul"> <note> 13 </note>
</eleve>
<eleve nom='Jacques'> <note>17 </note>
</eleve>
</liste>
String contenu = ((Text)
elt.getFirstChild()).getData();
Document
doc
, sera traité parElement liste = doc.getDocumentElement();
NodeList les_eleves = liste.getElementsByTagName("eleve");
for( int i=0; i<les_eleves.getLength(); i++ ){
Element l_eleve = (Element) les_eleves.item(i);
Element sa_note =
l_eleve.getElementsByTagName("note").item(0); // feuille
String le_nom =
l_eleve.getAttribute("nom");
String la_note =
((Text) sa_note.getFirstChild()).getData();
etc...
}
<?xml version="1.0"?>C'est une "normalisation" de ce genre qu'effectue la procédure elimTxt dans la classe PrettyMIL.
<liste><eleve nom='Pierre'><note> 12 </note></eleve><eleve nom="Paul"><note> 13 </note>...</liste>
Element
peut fort bien avoir des enfants
où se mélangent des Text
s et d'autres Element
s.Text
individuel, les autres étant des Element
s à
part entière.<p>
a ainsi 14 childNodes, dont 7 sont des Text.Document
auquel appartient
l'élément elt !Erreur WRONG_DOCUMENT_ERR: A node is used in a
different document than the one that created it
Document
Document
possède une méthode importNode
Node
)x
de la formeDocument
on écrit simplement :org.w3c.dom.DOMImplementation
,
null
"null
".NS
l'URL de l'espace de noms.String nomQual = pref.length()==0 ? rac :
pref+":"+rac;
DocumentType
.publId
)
et d'une URL (sysId
), par DocumentType dtd =
domi.createDocumentType(nomQual, publId, sysId);
publId
et sysId
)
peut être null.Document doc = domi.createDocument(NS,
nomQual, dtd);
DocumentType dtd = domi.createDocumentType(
"html",
"-//W3C//DTD
XHTML 1.0 Strict//EN",
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
);
Document doc = domi.createDocument(
"http://www.w3.org/1999/xhtml",
"html",
dtd
);
DOMSource ds = new DOMSource(doc);Si on veut envoyer le texte sur un flot de sortie comme celui d'une servlette (PrintWriter out),
StreamResult res = new StreamResult(new File(nomFich));
Transformer trans = TransformerFactory.newInstance().newTransformer();
trans.transform(ds, res);
publId
et sysId
, un seul des deux réglages
suffit.