4 votes

Exception de pointeur nul lors de l'analyse XML

Je dois parser un document XML et stocker les valeurs dans un fichier texte, quand je fais l'analyse des données normales (Si tous les tags ont des données) alors ça fonctionne bien, mais si un tag n'a pas de données alors il lance une "Null Pointer Exception" que dois-je faire pour éviter l'exception Null Pointer, veuillez me donner des suggestions avec des codes d'exemple.

        John
        Kaith
        Jho
        Directeur des Ventes

        Sharon
        Eunis

        Shiny
        mack

        Consultant SAP

code:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile {

    public static void main(String argv[]) {

      try {

        File fXmlFile = new File("c:\\file.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();

        System.out.println("Element racine :" + doc.getDocumentElement().getNodeName());
        NodeList nList = doc.getElementsByTagName("staff");
        System.out.println("-----------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

           Node nNode = nList.item(temp);
           if (nNode.getNodeType() == Node.ELEMENT_NODE) {

              Element eElement = (Element) nNode;

              System.out.println("Prénom : " + getTagValue("firstname", eElement));
              System.out.println("Nom de famille : " + getTagValue("lastname", eElement));
                  System.out.println("Surnom : " + getTagValue("nickname", eElement));
              System.out.println("Département : " + getTagValue("Department", eElement));

           }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
  }

  private static String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

        Node nValue = (Node) nlList.item(0);

    return nValue.getNodeValue();
  }

}

4voto

Jean Logeart Points 12166

Vérifiez simplement que l'objet n'est pas null :

private static String getTagValue(String tag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
    Node nValue = (Node) nlList.item(0);
    if(nValue == null) 
        return null;
    return nValue.getNodeValue();
}

String salary = getTagValue("Department", eElement);
if(salary != null) {
    System.out.println("Salaire : " + getTagValue("Department", eElement));
}

1voto

JB Nizet Points 250258
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

La ligne ci-dessus récupère les nœuds enfants de l'élément ayant le nom de balise donné. Si cet élément n'a pas de données, la liste de nœuds retournée est vide.

Node nValue = (Node) nlList.item(0);

La ligne ci-dessus récupère le premier élément de la liste de nœuds vide. Étant donné que la liste est vide, 0 est un indice invalide, et conformément à la documentation, null est retourné

return nValue.getNodeValue();

La ligne ci-dessus appelle donc une méthode sur une variable nulle, ce qui provoque une NPE.

Vous devez tester si la liste est vide, et retourner ce que vous voulez (par exemple une chaîne vide), si c'est le cas:

if (nList.getLength() == 0) {
    return "";
}
Node nValue = (Node) nlList.item(0);
return nValue.getNodeValue();

0voto

Sungray Points 41

Remplacer

System.out.println("First Name : " + getTagValue("firstname", eElement) == null?"":getTagValue("firstname", eElement));

par

System.out.println("First Name : " + getTagValue("firstname", eElement) == null?"":getTagValue("firstname", eElement));

même chose pour les autres balises.

0voto

Ce code devrait fonctionner :

// getNode function
private static String getNode(String sTag, Element eElement) {
    //si sTag existe (non nul) alors je récupère les childNodes -> nlList
    if (eElement.getElementsByTagName(sTag).item(0) != null){
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
        //vérifier si le child (nlList) contient quelque chose
        if ((nlList.getLength() == 0))//si le contenu est nul
            return "";
        //si le child contient quelque chose, extraire la valeur du premier élément
        Node nValue = (Node) nlList.item(0);
            return nValue.getNodeValue();
    }
    return "";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X