Search code examples
javaxmlxmldocument

XML Document - Checking Parent Node and then Iterating through the document


I am having a challenge trying to iterate through an XML Document. Please help.

  • For document 1 my approach works fine by first inspecting the parent node and then extracting the child node info.
  • I now have 2 XML outputs, the second differs from the first, I
    inspect the one and then extract the necessary information but for document two there is more than one entry i need to extract
  • both documents differ from each other
  • I am following some examples online and its helpful, kindly could you help with the code for document two below
  • While debugging I can inspect the document and nodes, I see them but I am struggling to extract the info
  • int length = nlist.getLength(), this is always Zero/0, changing the getElementsByTagName it the returns a length of 3.

This Code Works for the first document

NodeList nodeList = xmlDocument.getElementsByTagName("add:MemberKey");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node currentNode = nodeList.item(i);
                if (currentNode.getNodeType() != Node.ELEMENT_NODE)
                    continue;
                Element currentElement = (Element)currentNode;
                String tagValue = null;
                tagValue = getElementValue("add:MemberCID",currentElement);
                System.out.println(tagValue);
            }

This is my second document

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
        <bbb:CreateMemberResultAnnotation xmlns:bbb="http://www.google.com">
          <ResultHeader>
            <abc:Version>1.0</abc:Version>
            <abc:ResultNumber>1000</abc:ResultNumber>
            <abc:ResultOutcome>Complete.</abc:ResultOutcome>
            <abc:ResultReason>New Result</abc:ResultReason>
          </ResultHeader>
          <p>
            <bbb:ActivationTime>20200111215217</bbb:ActivationTime>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>123458687</add:MemberID>
                <add:MemberSeq>0987654332456</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>0987699544</add:MemberID>
                <add:MemberSeq>999999999999999</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>4444444444</add:MemberID>
                <add:MemberSeq>4444444444444</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
          </CreateMemberResult>
        </bbb:CreateMemberResultAnnotation>
      </soapenv:Body>
    </soapenv:Envelope>

Code to inspect my second document: I am struggling

public static checkMessageType(org.w3c.dom.Document xmlDocument) {
    Element docEle = xmlDocument.getDocumentElement();
    NodeList nlist= docEle.getElementsByTagName("bbb:CreateMemberResultAnnotation");
    int length = nlist.getLength(); // I am getting a 0 length here, 
    List<Element> childElement = new ArrayList<>();
    for (int i = 0; i < nlist.getLength(); i++) {
        //Node node = nlist.item(i).getOwnerDocument().getDocumentElement();
       // if (node instanceof Element) {
           // childElement.add((Element) node);
        if (nlist.item(i).getNodeType() == Node.ELEMENT_NODE) {
            Element el = (Element) nlist.item(i);
            if (el.getNodeName().contains("bbb:MemberInst")) {
                String XMLMemberID = el.getElementsByTagName("add:MemberID").item(0).getTextContent();
                String XMLMemberSeq = el.getElementsByTagName("add:MemberSeq").item(0).getTextContent();
            }
        }
 }

Solution

  • is your xml even parsed? What is this p tag at line 10? it is not closed anywhere. also there is a createMemberResult closing tag at line 36 but no opening before that

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
        <bbb:CreateMemberResultAnnotation xmlns:bbb="http://www.google.com">
          <ResultHeader>
            <abc:Version>1.0</abc:Version>
            <abc:ResultNumber>1000</abc:ResultNumber>
            <abc:ResultOutcome>Complete.</abc:ResultOutcome>
            <abc:ResultReason>New Result</abc:ResultReason>
          </ResultHeader>
            <bbb:ActivationTime>20200111215217</bbb:ActivationTime>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>123458687</add:MemberID>
                <add:MemberSeq>0987654332456</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>0987699544</add:MemberID>
                <add:MemberSeq>999999999999999</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
            <bbb:MemberInst>
              <add:MemberKey>
                <add:MemberID>4444444444</add:MemberID>
                <add:MemberSeq>4444444444444</add:MemberSeq>
              </add:MemberKey>
              <add:ActivationTime>20200111215217</add:ActivationTime>
              <add:DeativationTime>20370101000000</add:DeativationTime>
            </bbb:MemberInst>
        </bbb:CreateMemberResultAnnotation>
      </soapenv:Body>
    </soapenv:Envelope>
    

    This test here runs successfully :

          @Test
       public void test() throws ParserConfigurationException, SAXException, IOException {
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          DocumentBuilder builder = factory.newDocumentBuilder();
          URL resource = getClass().getResource("/yourxml.xml");
          Document xmlDocument = builder.parse(resource.openStream());
          Element docEle = xmlDocument.getDocumentElement();
          NodeList nlist = docEle.getElementsByTagName("bbb:CreateMemberResultAnnotation");
          int length = nlist.getLength(); // I am getting a 0 length here,
          List<Element> childElement = new ArrayList<>();
          for (int i = 0; i < nlist.getLength(); i++) {
             // Node node = nlist.item(i).getOwnerDocument().getDocumentElement();
             // if (node instanceof Element) {
             // childElement.add((Element) node);
             if (nlist.item(i).getNodeType() == Node.ELEMENT_NODE) {
                Element el = (Element) nlist.item(i);
                if (el.getNodeName().contains("bbb:MemberInst")) {
                   String XMLMemberID = el.getElementsByTagName("add:MemberID").item(0).getTextContent();
                   String XMLMemberSeq = el.getElementsByTagName("add:MemberSeq").item(0).getTextContent();
                }
             }
    
          }
       }