Tâche :
Vous avez un fichier XML "company.xml" qui ressemble à ceci :
<?xml version="1.0"?>
<company>
<employee>
<firstname>Tom</firstname>
<lastname>Cruise</lastname>
</employee>
<employee>
<firstname>Paul</firstname>
<lastname>Enderson</lastname>
</employee>
<employee>
<firstname>George</firstname>
<lastname>Bush</lastname>
</employee>
</company>
Vous devez lire ce fichier et imprimer le firstName
y lastName
les champs de tous les employés.
Java : [extrait de aquí ]
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlReader {
public static void main(String[] args) {
try {
File file = new File("company.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeLst = doc.getElementsByTagName("employee");
for (int s = 0; s < nodeLst.getLength(); s++) {
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("firstname");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
System.out.println("First Name: " + ((Node) fstNm.item(0)).getNodeValue());
NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("lastname");
Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
NodeList lstNm = lstNmElmnt.getChildNodes();
System.out.println("Last Name: " + ((Node) lstNm.item(0)).getNodeValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Scala : [extrait de aquí , slide #19 ]
import xml.XML
object XmlReader {
def main(args: Array[String]): Unit = {
XML.loadFile("company.xml") match {
case <employee> { employees @ _* } </employee> => {
for(e <- employees) {
println("First Name: " + (e \ "firstname").text)
println("Last Name: " + (e \ "lastname").text)
}
}
}
}
}
[ EDIT par Bill ; Voir les commentaires pour la discussion ] --
Hmm, comment le faire sans répondre dans une section de réponse non formatée... Hmph. Je suppose que je vais éditer ta réponse et te laisser la supprimer si ça te dérange.
C'est ainsi que je le ferais en Java avec de meilleures bibliothèques :
public scanForEmployees(String filename) {
GoodXMLLib source=new GoodXMLLib(filename);
while( String[] employee: source.scanFor("employee", "firstname", "lastname") )
{
System.out.println("First Name: " + employee[0]);
System.out.println("Last Name: " + employee[1]);
}
}
Il s'agit juste d'un hack rapide n'impliquant aucune magie et tous les composants sont réutilisables. Si je voulais ajouter un peu de magie, je pourrais faire quelque chose de mieux que de renvoyer un tableau de chaînes de caractères, mais même telle quelle, cette GoodXMLLib serait complètement réutilisable. Le premier paramètre de scanFor est la section, tous les paramètres suivants seraient les éléments à trouver, ce qui est limité, mais l'interface pourrait être légèrement améliorée pour ajouter plusieurs niveaux de correspondance sans réel problème.
J'admets que Java dispose d'un support de bibliothèque assez médiocre en général, mais allez - comparer une utilisation horrible de la bibliothèque XML de Java vieille de dix ( ?) ans à une mise en œuvre basée sur le laconisme n'est tout simplement pas juste - et est loin d'être une comparaison des langages !