Java DOM XML-parsering

Dus ik heb een XML-bestand in de volgende indeling:


   
      test
      deploy
      dev
      test01
      test02
      test03
   

I'm trying to parse this file and build an object that I can populate a JListBox with the names and a radiobutton group with the different servers, however each project consists of a different amount of servers. How do I iterate the nodes/childnodes to build the object with multiple servers. Here is snippets of the code I'm using borrowed from a website and some from me and I'm not very good at coding yet so bear with me please. When I debug it starts to parse & build the object but once it gets to the server names it prints a null pointer exception so I'm doing something totally wrong.

public class XMLParser {
    public Project currentProject = new Project();

    public void parseXML() throws Exception {

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

            NodeList nList = doc.getElementsByTagName("project");

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

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

                    currentProject.SetAppName(getTagValue("name", eElement));
                    currentProject.SetType(getTagValue("type", eElement));
                    currentProject.SetEnvironment(getTagValue("environment", eElement));
                    currentProject.SetServerName(getTagValue("server", 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();
          }


public final class Project {
    protected String AppName = null;
    protected String Type = null;
    protected List ServerNames = null;
    protected String Environment = null;

    public void SetAppName(String AppName) {
        this.AppName = AppName;
    }

    public void SetType(String DeployType) {
        this.Type = DeployType;
    }

    public void SetServerName(String ServerName) {
        this.ServerNames.add(ServerName);
    }

    public void SetEnvironment(String Environment) {
        this.Environment = Environment;
    }

    public String getAppName() {
        return AppName;
    }

    public String getType() {
        return Type;
    }

    public List getServerName() {
        return ServerNames;
    }

    public String getEnvironment() {
        return Environment;
    }


}
2
Je kunt zelf een helperklasse schrijven. Zie dit: stackoverflow.com/a/8346867/851432
toegevoegd de auteur Jomoos, de bron

2 antwoord

Uw uitzondering wordt veroorzaakt omdat u geen ServerNames in uw klasse Project hebt geïnitialiseerd. Probeer het als volgt te initialiseren en opnieuw uit te voeren:

final protected List ServerNames = new ArrayList();

2
toegevoegd
Beste om het te maken definitief beschermd Lijst ServerNames = new Lijst ();
toegevoegd de auteur alphazero, de bron
Overeengekomen, geweldige vangst-alphazero.
toegevoegd de auteur Bham503, de bron
Bedankt Adam, herzien.
toegevoegd de auteur Bham503, de bron
Bedankt, ik merkte dat niet eens op, één voorbehoud bij uw antwoord nadat ik het probeerde te proberen om erachter te komen dat List een interface is en ik een ArrayList moest gebruiken om het te instantiëren.
toegevoegd de auteur adam, de bron

Als uw xml is gemaakt met een xsd-schema, kunt u in plaats daarvan JAXB gebruiken om er klassen voor maken, met behulp van de xjc-tool. Dat zou je leven een beetje makkelijker moeten maken.

1
toegevoegd