Aufgabe:
Sie haben eine XML-Datei "company.xml", die folgendermaßen aussieht:
<?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>
Sie müssen diese Datei lesen und die Felder firstName
und lastName
aller Mitarbeiter ausdrucken .
Java: [von hier genommen ]
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: [von hier genommen , Folie Nr. 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 von Bill; Überprüfen Sie die Kommentare für die Diskussion] -
Hmm, wie geht das, ohne in einem unformatierten Antwortbereich zu antworten ... Hmph. Ich denke, ich werde Ihre Antwort bearbeiten und Sie sie löschen lassen, wenn es Sie nervt.
So würde ich es in Java mit besseren Bibliotheken machen:
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]);
}
}
Dies ist nur ein schneller Hack, der keine Magie und alle wiederverwendbaren Komponenten beinhaltet. Wenn ich etwas Magie hinzufügen wollte, könnte ich etwas Besseres tun, als ein Array von String-Arrays zurückzugeben, aber so wie es ist, wäre GoodXMLLib vollständig wiederverwendbar. Der erste Parameter von scanFor ist der Abschnitt. Alle zukünftigen Parameter sind die zu findenden Elemente, die begrenzt sind. Die Benutzeroberfläche kann jedoch leicht poliert werden, um mehrere Übereinstimmungsstufen ohne wirkliches Problem hinzuzufügen.
Ich gebe zu, dass Java im Allgemeinen eine ziemlich schlechte Bibliotheksunterstützung hat, aber es ist einfach nicht fair, eine schreckliche Verwendung von Javas jahrzehntelanger (?) Alter XML-Bibliothek mit einer Implementierung zu vergleichen, die darauf basiert, knapp zu sein aus einem Vergleich der Sprachen!