BoD,

--- BoD <[EMAIL PROTECTED]> wrote:
> 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.
Ok. I'll update the documentation.  However, I'd like to point out that
getPointer() and getValue() do (or are supposed to) return the same
result.  And there is also a difference between the ways jxpath handles
XML and JavaBeans.  In the case of XML there is no notion of a
collection, but in the case of JavaBeans there is.  For instance, if
you have a bean with this property:

int[] getIntArray()

then the path "intArray" will return the whole array, not its first
element.  

> Thanks again.
> 
> BoD

Thank you,

- Dmitri

> 
> "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.
> 
> 
=== message truncated ===


__________________________________________________
Do you Yahoo!?
Yahoo! Web Hosting - Let the expert host your site
http://webhosting.yahoo.com

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to