web-dev-qa-db-fra.com

Obtenir le nom de l'élément à partir de XML dans Java DOM

Je veux obtenir le nom de l'élément et imprimer les données dans le fichier XML, mais je ne sais pas comment obtenir des données sous un élément spécifique.

Voici l'exemple XML et mon 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());

Je veux seulement obtenir l'élément dans le film. mais le code suivant lit également le code <movie idref="vertigo"/> dans l'exécutant (provoque l'exception Nullpointer si je souhaite obtenir le contenu); Je me demande s'il est possible d'éviter de lire le sous Performance en utilisant DOM?

NodeList nodes = doc.getElementsByTagName("movie");

Ma dernière sortie pour le premier film devrait ressembler à ceci

('godfather', 'The Godfather', '1972', 'Crime;Drama')
13
Michael

Une façon de faire est de commencer à lire l'étiquette de films au lieu de l'étiquette de film. Je ne sais pas si c'est ce que vous cherchez !!. 

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());
}

Sortie:

: parrain 
: Le parrain 
: 1972 
: Crime: drame

17
Ramadas

Je vous suggère de lire sur XPath . Voici quelques exemples .

Par exemple, pour lire l'année de vos films, vous pouvez utiliser le XPath ...

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

J'ai eu le même problème, ceci est ma mise en œuvre,

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_