简体   繁体   中英

java xml dom parsing

I have this project I'm working on where I want to parse an xml file that looks like this:

<?xml version='1.0' encoding='UTF-8'?>
<projectlist>
  <project>
    <name>SuperDuperApp</name>
    <type>batch</type>
    <prod>
      <server>testserver01</server>
    </prod>
    <qa>
      <server>testserver01</server>
    </qa>
    <dev>
      <server>testserver01</server>
    </dev>
  </project>
  <project>
    <name>Calculator</name>
    <type>deploy</type>
    <prod>
      <server>testserver02</server>
      <server>testserver03</server>
      <server>testserver04</server>
    </prod>
    <qa>
      <server>testserver05</server>
      <server>testserver06</server>
      <server>testserver07</server>
    </qa>
    <dev>
      <server>testserver12</server>
      <server>testserver13</server>
      <server>testserver14</server>
    </dev>
  </project>
</projectlist>

With this method parsing the file and trying to print out in the format:

name: SuperDuperApp
type: batch
server: testserver01

name: Calculator
type: deploy
environment: dev
server: testserver12
server: testserver13
server: testserver14

etc.
public void parseXML() {
     ArrayList al = new ArrayList();
     HashSet hs = new HashSet();
    try {
        InputStream file = this.getClass().getResourceAsStream(
                "/net/swing/sandbox/util/config/projectlist.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(file);
        doc.getDocumentElement().normalize();

        System.out.println("Root element: " + doc.getDocumentElement().getNodeName());

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

        System.out.println("Information of all servers...");

        for (int i=0;i<nList.getLength();i++){
            Node fstNode = nList.item(i);

            if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
                Element fstElement = (Element) fstNode;

                NodeList nameElementList = fstElement.getElementsByTagName("name");
                Element nameElement = (Element) nameElementList.item(0);
                NodeList name = nameElement.getChildNodes();
                System.out.println("project name: " + ((Node) name.item(0)).getNodeValue());
                hs.add(((Node) name.item(0)).getNodeValue());

                NodeList typeElementList = fstElement.getElementsByTagName("type");
                Element typeElement = (Element) typeElementList.item(0);
                NodeList type = typeElement.getChildNodes();
                System.out.println("Deploy type: " + ((Node) type.item(0)).getNodeValue());

                //print out server list can't do it for some reason         
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }


     try {
     al.clear();
     al.addAll(hs);
     Collections.sort(al);
     for (int z = 0; z < al.size(); z++) {
     listModel.addElement(al.get(z));
     }
     } catch (Exception e) {
     e.printStackTrace();
     }
     lstProject.validate();

}

So I rewrote my method and now I'm just stuck <---newb

Check the documentation for Node . Each node has a method getChildNodes . Check that for the existence of children nodes and than iterate over them like you are doing.

If your xml was created using an xsd schema, you could instead use JAXB to create classes for it, using the xjc tool. That should make your life a bit easier.

我认为在你的情况下使用XSLT转换是合适的(更少的样板代码)查看TransformerFactory和java api进行xml处理。

As a q&d solution you could apply the same strategy as for getting "project" node:

...
System.out.println("servers:");

NodeList sList = eElement.getElementsByTagName("server");
for (int i = 0; i < sList.getLength(); i++) {
    String stuff = sList.item(i).getFirstChild().getNodeValue();
    System.out.println(stuff);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM