[ 
https://issues.apache.org/jira/browse/JXPATH-169?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14038078#comment-14038078
 ] 

Michele Vivoda commented on JXPATH-169:
---------------------------------------

It would probably help if you provide an attached test case (a java file, that 
compiles, menu MORE/ATTACH FILES)

> getChildNodes() has problems in 3rd level of nesting.
> -----------------------------------------------------
>
>                 Key: JXPATH-169
>                 URL: https://issues.apache.org/jira/browse/JXPATH-169
>             Project: Commons JXPath
>          Issue Type: Bug
>    Affects Versions: 1.2 Final
>         Environment: Windows, JDK 1.6
>            Reporter: Ruben Gerad Mathew
>
> In the event of using JXPath for reading an XML file, the getChildren() 
> method  is not fetching NodeList after 3rd level, and any structure after 3rd 
> level return #text (probably scrambled).  
> An XMI document with an UML structure was parsed, the objective was to 
> identify all attributes inside a class within a package.  The context 
> retrieves a list of pakages, getChildren() gets the classes embedded within 
> it and getChildren() on each node on Class gets both the attributes and 
> operations.  
> However we are unable to get the tagged values in attributes or look any 
> deeper than 3 levels. I tried to get the name of the attribute and use xpath 
> context lookup, but some reason it keeps failing.
> Some bit of the code to help.
>       private void inspectClasses(String handle, Node eachEntryNode){
>               try{
>                       UmlClass umlClass = new UmlClass();
>                       
> umlClass.setClassNamespace(eachEntryNode.getAttributes().getNamedItem("name").getNodeValue());
>                       
> umlClass.setXmiId(eachEntryNode.getAttributes().getNamedItem("xmi.id").getNodeValue());
>                       
> umlClass.setVisibility(eachEntryNode.getAttributes().getNamedItem("visibility").getNodeValue().toString());
>                       
> umlClass.setActiveClass(Boolean.parseBoolean(eachEntryNode.getAttributes().getNamedItem("isActive").getNodeValue().toString()));
>                       
> umlClass.setAbstractClass(Boolean.parseBoolean(eachEntryNode.getAttributes().getNamedItem("isAbstract").getNodeValue().toString()));
>                               for(int child =0; 
> child<eachEntryNode.getChildNodes().getLength();child++){
>                               
> if(eachEntryNode.getChildNodes().item(child).getNodeName().equals("UML:ModelElement.taggedValue")){
>                                       
> umlClass.setTaggedValue(getTaggedValues(eachEntryNode.getChildNodes().item(child).getChildNodes()));
>                                     
>                                       
> EventLog.clog(this,"["+umlClass.getClassNamespace()+"] Tagged values 
> :"+umlClass.getTaggedValue().size());                              
>                               }
>                               
> if(eachEntryNode.getChildNodes().item(child).getNodeName().equals("UML:Classifier.feature")){
>                                       
> umlClass.setUmlAttributes(getClassAttributes(handle, 
> eachEntryNode.getChildNodes().item(child)));
>                                       
> EventLog.clog(this,"["+umlClass.getClassNamespace()+"] Tagged values 
> :"+umlClass.getTaggedValue().size());                              
>                               }
>                               listClasses.add(umlClass);
>                               }
>                       }
>             catch(NullPointerException exp){        
>             }
>                       catch(Exception exp){
>                               ExceptionLog.clog(this, "Problem validating 
> nodes! Error: "+exp.getMessage());
>                       }
>       }
> public List<UmlAttribute> getClassAttributes(String handle, Node node){
>               List<UmlAttribute> classAttributes = new 
> ArrayList<UmlAttribute>();
>               
>               int child, y;
>               try{            
>                       Document document=(Document)parsedDocs.get(handle);
>                       JXPathContext context = 
> JXPathContext.newContext(document);
>                       context.setLenient(true);
>                       NodeList childNodes = node.getChildNodes();             
>                               for(child =0; 
> child<childNodes.getLength();child++){
>                                       
> if(childNodes.item(child).getNodeName().toString().equals("UML:Attribute")){
>                                               Node thisNode = 
> childNodes.item(child);
>                                               NodeList listNodes 
> =childNodes.item(child).getChildNodes();
>                                               //List entries= 
> context.selectNodes("//UML:Attribute"); //this was a out of the way attempt 
> to get inside the next level of nested class attribute tag values
>                                               EventLog.clog(this, 
> "^^^^^^^^^^^^^^^  
> "+thisNode.getAttributes().getNamedItem("name").getNodeValue().toString());   
>                             
>                                               
> locateAttribute(thisNode.getAttributes().getNamedItem("name").getNodeValue().toString(),
>  listNodes); // unabale to iterate listNodes children. 3rd-4th level missing 
> values and prints only #text as result.
>                                       }
>                                       //EventLog.clog(this, "***************  
> "+childNodes.item(child).getNodeName().toString());                           
>   
>                               }
>                       }catch(Exception exp){
>                       ExceptionLog.clog(this,"Problem orgnaizing namespace 
> structure"+exp.getMessage());                      
>               }
>               return classAttributes;
>       }



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to