Ich möchte den Elementnamen abrufen und die Daten in XML drucken, aber nicht sicher, wie Daten unter einem bestimmten Element abgerufen werden.
Hier ist das XML-Beispiel und mein Code.
<mdb>
<movies>
<movie id="godfather">
<title>The Godfather</title>
<year>1972</year>
<directors>
<director idref="francisfordcoppola"/>
</directors>
<genres>
<genre>Crime</genre>
<genre>Drama</genre>
</genres>
<cast>
<performer>
<actor idref="marlonbrando"/>
<role>Don Vito Corleone</role>
</performer>
</cast>
</movie>
</movies>
<performer id="kimnovak">
<name>Marilyn Pauline Novak</name>
<dob>1933-02-13</dob>
<pob>Chicago, Illinois, USA</pob>
<actedin>
<movie idref="vertigo"/>
</actedin>
</performer>
</mdb>
try {
File fXmlFile = new File(filename);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
NodeList nodes = doc.getElementsByTagName("movie");
System.out.println("nodes length"+ nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++){
Element element = (Element) nodes.item(i);
NodeList name = element.getElementsByTagName("title");
Element line = (Element) name.item(0);
System.out.println(": " + line.getFirstChild().getTextContent());
Ich möchte nur das Element in den Film bekommen. Der folgende Code liest jedoch auch die <movie idref="vertigo"/>
im Performer (verursacht eine Nullpointer-Ausnahme, wenn ich den Inhalt abrufen möchte); Ich frage mich, ob es eine Möglichkeit gibt, das Lesen unter Performance mit DOM zu vermeiden?
NodeList nodes = doc.getElementsByTagName("movie");
Meine endgültige Ausgabe für den ersten Film sollte so aussehen
('godfather', 'The Godfather', '1972', 'Crime;Drama')
Eine Möglichkeit, dies zu tun, ist das Lesen des Movies-Tags anstelle des Movie-Tags. Nicht sicher, ob Sie das suchen !!
NodeList nodes = doc.getElementsByTagName("movies");
Element element = (Element) nodes.item(0);
NodeList movieList = element.getElementsByTagName("movie");
for (int i = 0; i < movieList.getLength(); i++) {
Element movieElement = (Element) movieList.item(i);
System.out.println(movieElement.getAttributes().getNamedItem("id").getNodeValue());
NodeList name = movieElement.getElementsByTagName("title");
NodeList year = movieElement.getElementsByTagName("year");
NodeList genres = movieElement.getElementsByTagName("genres");
Element genreline = (Element) genres.item(0);
System.out.println(name.item(0).getFirstChild().getTextContent());
System.out.println(year.item(0).getFirstChild().getTextContent());
System.out.println(genreline.getElementsByTagName("genre").item(0).getTextContent()
+ ":" + genreline.getElementsByTagName("genre").item(1).getTextContent());
}
Ausgabe :
: Pate
: Der Pate
1972
: Krimi Drama
Ich hatte das gleiche Problem, das ist meine Implementierung,
public String getTagValue(org.w3c.dom.Document xmlDoc, String tagName) throws Exception {
xmlDoc.getDocumentElement().normalize();
NodeList nodeList = xmlDoc.getElementsByTagName(tagName);
for (int temp = 0; temp < nodeList.getLength(); temp++) {
Node nNode = nodeList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
org.w3c.dom.Element eElement = (org.w3c.dom.Element) nNode;
return eElement.getFirstChild().getNodeValue();
}
}
return "-1";
}