1 false false

Java DOM xml can not 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'm having trouble getting ConnNum, IsMSPA, IsArray and IsDDOR. I tried to get 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 expects 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("------------------"); } } 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() ); } } } 
+6
source share
5 answers

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

Nodes are of type, and you can repeat all the children that check the Element node to get a handle to the actual elements.

Edit:. Output values ​​after that. It filters the Element nodes, and then the first child node (the one that contains 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 writes correctly, you can use getTextContent() instead of childNode.getFirstChild().getNodeValue() if you use Java 1.5 or higher.

+12
source
  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()); } } 
+5
source

Here you should use getTextContent () . You can use getNodeName() first (in the debug version only) to make sure you are in the right place.

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

+2
source

Try to call

 doc.getDocumentElement() 

instead

 doc.getFirstChild() 
0
source

If I am going to use the DOM parser. I always prefer the following approach, since we do not need to know each xml tag and print them one at a time.

 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
source

Source: https://habr.com/ru/post/891141/


All Articles