Ok now I understand, thank you :)
I think it would be good to insist in the documentation that the methods
returning pointers never return collections even if the xpath is a
collection. It's a bit misleading (well at least, to me :) that given the
same xpath, getPointer and getValue won't return the same result.
Thanks again.
BoD
"Dmitri Plotnikov" <[EMAIL PROTECTED]> a �crit dans le message de news:
[EMAIL PROTECTED]
> Hi,
>
> --- BoD <[EMAIL PROTECTED]> wrote:
> > Hi! I'm trying to use jxpath to easily parse a simple xml file and
> > avoid
> > using the DOM interfaces.
> > But I'm confused about one thing.
> > Here is the file I want to analyse:
> >
> > -xml file--------------------------------------
> >
> > <?xml version="1.0" encoding="utf-8"?>
> > <configurator>
> > <field id="test1" type="TextField">
> > <ldap-key>test1 ldapkey</ldap-key>
> > <label>test1:</label>
> > <tooltip>test1 tooltip</tooltip>
> > <icon>test1 tooltip</icon>
> > <ldap-access>
> > <read/>
> > <write/>
> > </ldap-access>
> > <emulation>
> > <activex/>
> > <java/>
> > </emulation>
> > <possible-value-labels>
> > <label>possible value label 1</label>
> > <label>possible value label 2</label>
> > <label>possible value label 3</label>
> > </possible-value-labels>
> > <possible-values>
> > <value>toto</value>
> > <value>tutu</value>
> > <value>titi</value>
> > </possible-values>
> > <default-values>
> > <value>tutu</value>
> > </default-values>
> > </field>
> >
> >
> > <field id="test2" type="CheckBox">
> > <ldap-key>test2 ldapkey</ldap-key>
> > <label>test2</label>
> > <tooltip>test2 tooltip</tooltip>
> > <!--icon>test1 tooltip</icon--> <!-- no icon -->
> > <ldap-access>
> > <write/>
> > </ldap-access>
> > <emulation>
> > <java/>
> > </emulation>
> > <!--possible-value-labels/--> <!-- not used in a checkbox -->
> > <possible-values>
> > <value>toto</value>
> > <value>tutu</value>
> > </possible-values>
> > <default-values>
> > <value>tutu</value>
> > </default-values>
> > </field>
> >
> > </configurator>
> >
> > -eof-----------------------------------
> >
> >
> >
> > And here is my code, that include my questions in the comments:
> >
> >
> > -java file-----------------------------
> >
> > // [snip xml file opening]
> >
> > Element rootNode = doc.getDocumentElement(); // <configurator>
> > JXPathContext configuratorContext =
> > JXPathContext.newContext(rootNode);
> > configuratorContext.setLenient(true); // will return null if a node
> > is not
> > there, instead of throwing an exception
> > Iterator fieldList = configuratorContext.iteratePointers("field");
> > while (fieldList.hasNext())
> > {
> > Pointer pointer = (Pointer)fieldList.next();
> >
> >
> > // first question : is there a better way of doing this, e.g.
> > creating
> > // a new [sub]context instead of concate pointer everywhere? If so,
> > how
> > // to do this?
> There is currently no better way, but it sounds like it might make
> sense to add that kind of functionality. I'll think about it.
>
> > String fieldName =
> > (String)configuratorContext.getValue(pointer+"/@id");
> > String type =
> > (String)configuratorContext.getValue(pointer+"/@type");
> > String LDAPKey =
> > (String)configuratorContext.getValue(pointer+"/ldap-key");
> > String label =
> > (String)configuratorContext.getValue(pointer+"/label");
> > String toolTip =
> > (String)configuratorContext.getValue(pointer+"/tooltip"); // can be
> > null
> > String icon =
> > (String)configuratorContext.getValue(pointer+"/icon"); //
> > can be null
> >
> > int LDAPAccess = 0;
> > if
> >
>
(((NodePointer)configuratorContext.getPointer(pointer+"/ldap-access/read")).
> > isActual())
> > LDAPAccess += Field.LDAP_ACCESS_READ;
> > if
> >
>
(((NodePointer)configuratorContext.getPointer(pointer+"/ldap-access/write"))
> > .isActual())
> > LDAPAccess += Field.LDAP_ACCESS_WRITE;
> > int emulation = 0;
> > if
> >
>
(((NodePointer)configuratorContext.getPointer(pointer+"/emulation/activex"))
> > .isActual())
> > emulation += Field.EMULATION_ACTIVEX;
> > if
> >
>
(((NodePointer)configuratorContext.getPointer(pointer+"/emulation/java")).is
> > Actual())
> > emulation += Field.EMULATION_JAVA;
> >
> > Pointer labelsPointer = =
> >
> configuratorContext.getPointer(pointer+"/possible-value-labels/label");
> > System.out.println(labelsPointer);
> >
> > // this prints:
> > // /field[1]/possible-value-labels[1]/label[1]
> > //
> > // Why the last '[1]', it's supposed to be a collection so no '[1]' !
> The getPointer() method always looks for the first match. The iterate()
> method is the one used when you need a collection.
>
> > Iterator possibleValueLabelsIterator =
> > configuratorContext.iterate(labelsPointer.asPath());
> > while (possibleValueLabelsIterator.hasNext())
> > System.out.println(possibleValueLabelsIterator.next());
> > // so this one above doesn't work (returns an Iterator with only one
> > element)
> True.
>
> > // but this one below works:
> > Iterator possibleValueLabelsIterator =
> > configuratorContext.iterate(pointer+"/possible-value-labels/label");
> > while (possibleValueLabelsIterator.hasNext())
> > System.out.println(possibleValueLabelsIterator.next());
> Correct.
> >
> > // how come ?
> I think it makes sense. A pointer points at an individual element by
> definition, so the presense of "[index]" in the path is justified. And
> once you have that [index] you are stuck with element it points to.
>
> You might want to use the original path rather than the pointers in the
> path concatenation expressions.
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>