webentwicklung-frage-antwort-db.com.de

Rufen Sie den Elementnamen aus XML in Java DOM ab

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')
13
Michael

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

17
Ramadas

Ich schlage vor, Sie lesen auf XPath . Hier sind einige Beispiele .

Um beispielsweise das Jahr für Ihre Filme zu lesen, können Sie den XPath verwenden ...

/mdb/movies/movie/year/text()
2
Andrew White

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";
    }
0
tk_