2009-11-24 7 views
1

J'ai un simple fichier XMLlecture du fichier XML en java

<requirements> 
    <requirement> 
     <name> SwitchON</name> 
     <id>1</id> 
     <text>The Light shall turn on when the Switch is on.</text> 
    </requirement> 
    <requirement> 
     <name>SwitchOFF</name> 
     <id>2</id> 
     <text>The Light shall turn off when the Switch is off.</text> 
    </requirement> 
    <requirement> 
     <name>Lightbulb</name> 
     <id>3</id> 
     <text>The Light bulb shall be connected </text> 
    </requirement> 
    <requirement> 
     <name>Power</name> 
     <id>4</id> 
     <text>The Light shall have the power supply</text> 
    </requirement> 
</requirements> 

Je suis en train de montrer les informations contenues dans ce fichier dans un modèle de table. J'ai une méthode (readFromXMl) qui lit le fichier XML et retourne un modèle de table.

public static RequirementTable readFromXMl(String fileName) { 
     RequirementTable T = new RequirementTable(); 
     Requirement R = new Requirement(); 

     try { 

      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(new File(fileName)); 
      doc.getDocumentElement().normalize(); 
      NodeList listOfRequirements = doc.getElementsByTagName("requirement"); 

      int test = listOfRequirements.getLength(); 
      System.out.println("Total no of people : " + test); 


      for (int i = 0; i < listOfRequirements.getLength(); i++) { 
        Node RequirementNode = listOfRequirements.item(i); 
       if (RequirementNode.getNodeType() == Node.ELEMENT_NODE) { 
        Element RequirementElement = (Element) RequirementNode; 



        NodeList IdList = RequirementElement.getElementsByTagName("id"); 
        Element IdElement = (Element) IdList.item(0); 
        NodeList textIdList = IdElement.getChildNodes(); 
        R.setId(Integer.parseInt(textIdList.item(0).getNodeValue())); 

        NodeList DescriptionList = RequirementElement.getElementsByTagName("text"); 
        Element DescriptionElement = (Element) DescriptionList.item(0); 
        NodeList textDescriptionList = DescriptionElement.getChildNodes(); 
        R.setText(textDescriptionList.item(0).toString()); 

        NodeList NameList = RequirementElement.getElementsByTagName("name"); 
        Element NameElement = (Element) NameList; 
        NodeList textNameList = NameElement.getChildNodes(); 



        if (textNameList.item(0).toString().equals("SwitchON")) { 
         T.addRequirement((SwitchOnReq)R); 
        } else if (textNameList.item(0).toString().equals("SwitchOFF")) { 
         T.addRequirement((SwitchOFFReq)R); 
        } else if (textNameList.item(0).toString().equals("LightBulb")) { 
         T.addRequirement((BulbRequirement)R); 
        } else if (textNameList.item(0).toString().equals("Power")) { 
         T.addRequirement((PowerRequirement)R); 
        } 
} 
} 
} catch (SAXParseException err) { 
      System.out.println("** Parsing error" + ", line " + err.getLineNumber() + ", uri " + err.getSystemId()); 
      System.out.println(" " + err.getMessage()); 

     } catch (SAXException e) { 
      Exception x = e.getException(); 
      ((x == null) ? e : x).printStackTrace(); 

     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
     return T; 

    } 

Cependant, dans cette ligne, je reçois une erreur qui dit que le pointeur est nul Element IdElement = (Element) IdList.item(0); IdElement est nul !!

Répondre

1

au lieu de tous les autres xml looping et la laideur, permettez-moi de suggérer une méthode peu d'aide:

private static String getNodeValue(Node n, String path) 
     throws XPathExpressionException { 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    return (String) xpath.evaluate(path, n, XPathConstants.STRING); 
} 

Utilisez comme ceci:

for (int i = 0; i < listOfRequirements.getLength(); i++) { 
Node RequirementNode = listOfRequirements.item(i); 
System.out.println("name:" + getNodeValue(RequirementNode, "name")); 
System.out.println("id:" + getNodeValue(RequirementNode, "id")); 
System.out.println("text:" + getNodeValue(RequirementNode, "text")); 

...

pour obtenir tous les valeurs et définir vos besoins.