Ruben Gerad Mathew created JXPATH-169:
-----------------------------------------
Summary: 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)