开发者

Java DOM xml cant get child

My XML looks like this:

<ConnProf ConnProfID="1111">
  <ConnNum>1</ConnNum>
  <IsMSPA>false</IsMSPA>
  <IsArray>false</IsArray>
  <IsDDOR>false</IsDDOR>

  <Subsystem SSID="2222"ConnProfID="3333">
    <SSName>AA</SSName>
    <GenericSSName>AA</GenericSSName>
    <ConnFuncAddr>aaa</ConnFuncAddr>
    <DSSNum>22</DSSNum>
    <isRemoved>false</isRemoved>
  </Subsystem>

  <Subsystem SSID="4444" ConnProfID="5555">
    <SSName>BBBB</SSName>
    <GenericSSName>BB</GenericSSName>
    <ConnFuncAddr>bbbbbb</ConnFuncAddr>
    <DSSNum>44</DSSNum>
    <isRemoved>false</isRemoved>
  </Subsystem>

I am having trouble getting ConnNum, IsMSPA, IsArray, and IsDDOR. I tried getting ConnNum with:

//get ConnNum
                Node n = doc.getFirstChild();
                if (n.hasChildNodes())
                    System.out.println(n.getFirstChild().getNodeValue());
                else 
                    System.out.println(n.getNodeValue());

but it just returns null when im expecting 1.

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class test 
{
    public static void main(String[] args)
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try 
        {
            DocumentBuilder db = dbf.newDocumentBuilder();

            for (int i = 1; i <= 8; i++)
            {
                Document doc = db.parse("file" + i + ".xml");

                doc.getDocumentElement ().normalize ();
                System.out.println ("Root element of the doc is " + doc.getDocumentElement().getNodeName());

                //get ConnNum
                Node n = doc.getFirstChild();
                if (n.hasChildNodes())
                    System.out.println(n.getFirstChild().getNodeValue());
                else 
                    System.out.println(n.getNodeValue());

                NodeList listOfSubsystems = doc.getElementsByTagName("Subsystem");
                int totalSubsystems = listOfSubsystems.getLength();

                if (totalSubsystems == 0)
                    continue;
                else
                {
                    System.out.println("Total number of subsystems : " + totalSubsystems + "\n");

                    Dish dish = new Dish();

                    for(int s=0; s < listOfSubsystems.getLength() ; s++)
                    {
                        Node firstPersonNode = listOfSubsystems.item(s);

                        if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE)
                        {
                            Element firstPersonElement = (Element)firstPersonNode;

                            printElement(firstPersonElement, "SSName");
                            printElement(firstPersonElement, "GenericSSName");
                            printElement(firstPersonElement, "ConnFuncAddr");
                            printElement(firstPersonElement, "DSSNum");
                            printElement(firstPersonElement, "SCNum");
                            printElement(firstPersonElement, "SCAcronym");
                            printElement(firstPersonElement, "PassNum");
                            printElement(firstPersonElement, "FzCode");
                            printElement(firstPersonElement, "isRemoved");
                            System.out.println("------------------");
                   开发者_JAVA百科     }
                    }
                    System.out.println("\n==============================");
                }

            }
        }
        catch(ParserConfigurationException pce) 
        {
            pce.printStackTrace();
        }
        catch(SAXException se) 
        {
            se.printStackTrace();
        }
        catch(IOException ioe) 
        {
            ioe.printStackTrace();
        }
    }   

    public static void printElement(Element a, String name)
    {
        NodeList elementList = a.getElementsByTagName(name);
        Element b = (Element)elementList.item(0);

        if (b != null)
        {
            NodeList list = b.getChildNodes();
            System.out.println( ((Node)list.item(0)).getNodeValue().trim() );
        }
    }
}


Perhaps the first child is not what you think it is. Whitespace is important in XML and it is possible that the firstChild is actually a text node.

Nodes have a type and you can iterate all the children checking for Element node type to get a handle to the actual elements.

Edit: This prints the values you are after. It is filtering on Element nodes and then the first child node (the one containing the text) of each.

NodeList nodeList = n.getChildNodes();
for (int j = 0; j < nodeList.getLength(); j++) {
    Node childNode = nodeList.item(j);
    if (childNode.getNodeType() == Node.ELEMENT_NODE) {
        System.out.println(childNode.getNodeName() + " " + childNode.getFirstChild().getNodeValue());
    }
}

Also, as @Steve Townsend correctly writes, you could use getTextContent() instead of childNode.getFirstChild().getNodeValue() if you are using Java 1.5 or above.


 NodeList nodeList = n.getChildNodes();
 for (int j = 0; j < nodeList.getLength(); j++) {
     Node childNode = nodeList.item(j);
     if (childNode instanceof Element) {
          Element childElement = (Element) childNode;
          System.out.println(childElement.getNodeName() + " " +     childElement.getFirstChild().getNodeValue());
      }
  }   


You need to use getTextContent() here. You can use getNodeName() first (in debug version only) to ensure you are in the correct place.

getNodeValue() returns null if the node in hand is an element. There's a table here that describes the results of getNode* in each possible context.


Try calling

doc.getDocumentElement()

instead of

doc.getFirstChild()


If i am going to use DOM parser. I will always prefer following approach as we don't need to know every tag of xml and print them one by one.

import java.io.BufferedWriter;
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

 import javax.xml.parsers.DocumentBuilder;  
 import javax.xml.parsers.DocumentBuilderFactory;  
 import org.w3c.dom.Document;  
 import org.w3c.dom.Node;  
 import org.w3c.dom.NodeList;  



public class RecDOMP {


public static void main(String[] args) throws Exception{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
        dbf.setValidating(false); 
        DocumentBuilder db = dbf.newDocumentBuilder();   

// replace following  path with your input xml path  
         Document doc = db.parse(new FileInputStream(new File  ("D:\\ambuj\\input.xml")));  

// replace following  path with your output xml path 
         File OutputDOM = new File("D:\\ambuj\\outapip1.txt");
            FileOutputStream fostream = new FileOutputStream(OutputDOM);
            OutputStreamWriter oswriter = new OutputStreamWriter (fostream);
            BufferedWriter bwriter = new BufferedWriter(oswriter);

            // if file doesnt exists, then create it
            if (!OutputDOM.exists()) {
                OutputDOM.createNewFile();}


            visitRecursively(doc,bwriter);
            bwriter.close(); oswriter.close(); fostream.close();

            System.out.println("Done");
}
public static void visitRecursively(Node node, BufferedWriter bw) throws IOException{  

             // get all child nodes  
         NodeList list = node.getChildNodes();                                  
         for (int i=0; i<list.getLength(); i++) {          
                 // get child node              
       Node childNode = list.item(i);  
       if (childNode.getNodeType() == Node.TEXT_NODE)
       {
   //System.out.println("Found Node: " + childNode.getNodeName()           
    //   + " - with value: " + childNode.getNodeValue()+" Node type:"+childNode.getNodeType()); 

   String nodeValue= childNode.getNodeValue();
   nodeValue=nodeValue.replace("\n","").replaceAll("\\s","");
   if (!nodeValue.isEmpty())
   {
       System.out.println(nodeValue);
       bw.write(nodeValue);
       bw.newLine();
   }
       }
       visitRecursively(childNode,bw);  

            }         

     }  

}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜