You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Michael Nestler <mn...@gmail.com> on 2005/04/07 19:08:28 UTC

[JXPath] Context Namespace-Relative Queries (v1.2)

Hello,

I recently had to switch from JXPath 1.1 to 1.2 in order to benefit
from some bug fixes. I am using JDOM 1.0. It appears that JXPath's
behavior regarding namespaces in JDOM trees changed and became less
convenient and flexible.

I have documents like this:

<html xmlns="http://www.w3.org/1999/xhtml">
  <table>
    <tr>
      <td>page</td>
      <td>type</td>
      <td>comment</td>
    </tr>
    <tr>
      <td><a href="/Home"/></td>
      <td>conf</td>
      <td>Home Page</td>
    </tr>
    <tr>
      <td><a href="/ToolBar"/></td>
      <td>conf</td>
      <td>Tool Bar</td>
    </tr>
  </table>
</html>

The namespace of the root element is variable and might be the XHTML
namespace, another namespace, or no namespace at all. The table
structure is always the same, and cell values vary. And I have some
code that executes the following query:

SAXBuilder sax = new SAXBuilder();
Document doc = sax.build(new StringReader(...);
Element rootElement = doc.getRootElement();
JXPathContext ctx = JXPathUtil.newContext(rootElement);
String value = ctx.getValue("/table/tr[2]/td[2]");

This worked fine with JXPath 1.1, but it doesn't work anymore with
1.2. The new JXPath version throws an exception:

org.apache.commons.jxpath.JXPathException: No value for xpath:
/table/tr[2]/td[2]
	at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:344)
	at org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:280)

Why would this not work, considering that all the DOM nodes live in
the same namespace - the namespace of the context bean (root element)?
It appears that I can register the XHTML namespace, but then I have to
use a prefix for every element name in my query - and it won't work if
the namespace is not set or is different (that's possible in my app).

Is there a solution to this problem, i.e. is there a way to make
JXPath interpret the root element's namespace as the default namespace
requiring no prefix in XPath queries?

Thanks in advance,
-Michael

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org


Re: [JXPath] Context Namespace-Relative Queries (v1.2)

Posted by Dmitri Plotnikov <dm...@apache.org>.
Michael,

I am still struggling to reconcile these solutions with the XPath standard.

Could anyone provide an example of how this problem is dealt with in XSLT?

Thanks,

- Dmitri

----- Original Message ----- 
From: "Michael Nestler" <mn...@gmail.com>
To: <co...@jakarta.apache.org>; "Dmitri Plotnikov" 
<dm...@apache.org>
Sent: Wednesday, April 20, 2005 1:50 PM
Subject: Re: [JXPath] Context Namespace-Relative Queries (v1.2)


Dmitri,

Please see my comments below.

On 4/17/05, Dmitri Plotnikov <dm...@apache.org> wrote:
> Michael,
>
> You are not the first to raise this issue.  See for example the discussion
> in this bug report:
> http://issues.apache.org/bugzilla/show_bug.cgi?id=32360

I can understand the frustration.

> I think it's time we finally resolve the problem.
>
> We have come up with three alternative solutions so far:
>
> 1. Using "null" for namespace prefix.  I don't necessarily like the idea -
> it feels atrificial and it blocks access to elements that have no 
> namespace
> at all.

Right, I don't like it either.

> 2. We introduce this new method on JXPathContext:
>
>    context.registerDefaultNamespace(ns);
>
> Then whenever a name is used without prefix in an XPath, this default
> namespace is assumed.  This is effectively the same as 1, except that
> aestetically this looks better.  Unfortunately this solution has the same
> problem: you can no longer reference elements that really don't have any
> namespace.

I agree.

> 3. We introduce this other method on JXPathContext:
>    context.setNamespaceIgnored(ns, boolean)
>
> This would allow us to register one or multiple namespaces that should be
> ignored altogether.  Let's say
>  - you call context.setNamespaceIgnored("abc", true)
>  - you have a document that looks like this:
>
>  <foo xmlns:names="abc">
>    <a>y</a>
>    <names:a>x</names:a>
>  </foo>
>
> - and you try to resolve the xpath "//a"
>
> This path will return both elements: x and y, one because it does not have 
> a
> namespace and the other because its namespace is ignored.
>
> This third option is my favorite.
>
> What do you think?

I think it would be useful and I would certainly make use of this feature.

But I don't think it would solve the problem I mentioned in my
original email. I am not able to entirely ignore namespaces. My
problem is that my root element's namespace is variable (could be
XHTML, a custom namespace, or nothing) - but I still want to make sure
that the child elements' namespace is the same as the root element's.
In other words: I want to distinguish between "the root elements'
namespace" and "no namespace" (and "another namespace"). Your option
#3 as I understand it would not allow that, right?

Can I suggest an option #4? Could JXPathContext (preferrably per
default) make the namespace of the root element the default namespace
for queries? Then I could execute queries reliably and independent of
the actual namespace of the root element, but at the same time ensure
that all queried child elements are in the same namespace as the root
element.

Does this make sense or would this collide with other requirements?

To summarize, I really think that your option #3 is the best of 1-3. I
would be really happy if JXPath would implement both #4 and #3.

-Michael


> ----- Original Message -----
> From: "Michael Nestler" <mn...@gmail.com>
> To: <co...@jakarta.apache.org>
> Sent: Thursday, April 07, 2005 1:08 PM
> Subject: [JXPath] Context Namespace-Relative Queries (v1.2)
>
> > Hello,
> >
> > I recently had to switch from JXPath 1.1 to 1.2 in order to benefit
> > from some bug fixes. I am using JDOM 1.0. It appears that JXPath's
> > behavior regarding namespaces in JDOM trees changed and became less
> > convenient and flexible.
> >
> > I have documents like this:
> >
> > <html xmlns="http://www.w3.org/1999/xhtml">
> >  <table>
> >    <tr>
> >      <td>page</td>
> >      <td>type</td>
> >      <td>comment</td>
> >    </tr>
> >    <tr>
> >      <td><a href="/Home"/></td>
> >      <td>conf</td>
> >      <td>Home Page</td>
> >    </tr>
> >    <tr>
> >      <td><a href="/ToolBar"/></td>
> >      <td>conf</td>
> >      <td>Tool Bar</td>
> >    </tr>
> >  </table>
> > </html>
> >
> > The namespace of the root element is variable and might be the XHTML
> > namespace, another namespace, or no namespace at all. The table
> > structure is always the same, and cell values vary. And I have some
> > code that executes the following query:
> >
> > SAXBuilder sax = new SAXBuilder();
> > Document doc = sax.build(new StringReader(...);
> > Element rootElement = doc.getRootElement();
> > JXPathContext ctx = JXPathUtil.newContext(rootElement);
> > String value = ctx.getValue("/table/tr[2]/td[2]");
> >
> > This worked fine with JXPath 1.1, but it doesn't work anymore with
> > 1.2. The new JXPath version throws an exception:
> >
> > org.apache.commons.jxpath.JXPathException: No value for xpath:
> > /table/tr[2]/td[2]
> > at
> > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:344)
> > at
> > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:280)
> >
> > Why would this not work, considering that all the DOM nodes live in
> > the same namespace - the namespace of the context bean (root element)?
> > It appears that I can register the XHTML namespace, but then I have to
> > use a prefix for every element name in my query - and it won't work if
> > the namespace is not set or is different (that's possible in my app).
> >
> > Is there a solution to this problem, i.e. is there a way to make
> > JXPath interpret the root element's namespace as the default namespace
> > requiring no prefix in XPath queries?
> >
> > Thanks in advance,
> > -Michael
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: commons-user-help@jakarta.apache.org
> >
> >
> >
> >
>
>





---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org


Re: [JXPath] Context Namespace-Relative Queries (v1.2)

Posted by Michael Nestler <mn...@gmail.com>.
Dmitri,

Please see my comments below.

On 4/17/05, Dmitri Plotnikov <dm...@apache.org> wrote:
> Michael,
> 
> You are not the first to raise this issue.  See for example the discussion
> in this bug report:
> http://issues.apache.org/bugzilla/show_bug.cgi?id=32360

I can understand the frustration.

> I think it's time we finally resolve the problem.
> 
> We have come up with three alternative solutions so far:
> 
> 1. Using "null" for namespace prefix.  I don't necessarily like the idea -
> it feels atrificial and it blocks access to elements that have no namespace
> at all.

Right, I don't like it either.

> 2. We introduce this new method on JXPathContext:
> 
>    context.registerDefaultNamespace(ns);
> 
> Then whenever a name is used without prefix in an XPath, this default
> namespace is assumed.  This is effectively the same as 1, except that
> aestetically this looks better.  Unfortunately this solution has the same
> problem: you can no longer reference elements that really don't have any
> namespace.

I agree.
 
> 3. We introduce this other method on JXPathContext:
>    context.setNamespaceIgnored(ns, boolean)
> 
> This would allow us to register one or multiple namespaces that should be
> ignored altogether.  Let's say
>  - you call context.setNamespaceIgnored("abc", true)
>  - you have a document that looks like this:
> 
>  <foo xmlns:names="abc">
>    <a>y</a>
>    <names:a>x</names:a>
>  </foo>
> 
> - and you try to resolve the xpath "//a"
> 
> This path will return both elements: x and y, one because it does not have a
> namespace and the other because its namespace is ignored.
> 
> This third option is my favorite.
> 
> What do you think?

I think it would be useful and I would certainly make use of this feature.

But I don't think it would solve the problem I mentioned in my
original email. I am not able to entirely ignore namespaces. My
problem is that my root element's namespace is variable (could be
XHTML, a custom namespace, or nothing) - but I still want to make sure
that the child elements' namespace is the same as the root element's.
In other words: I want to distinguish between "the root elements'
namespace" and "no namespace" (and "another namespace"). Your option
#3 as I understand it would not allow that, right?

Can I suggest an option #4? Could JXPathContext (preferrably per
default) make the namespace of the root element the default namespace
for queries? Then I could execute queries reliably and independent of
the actual namespace of the root element, but at the same time ensure
that all queried child elements are in the same namespace as the root
element.

Does this make sense or would this collide with other requirements?

To summarize, I really think that your option #3 is the best of 1-3. I
would be really happy if JXPath would implement both #4 and #3.

-Michael


> ----- Original Message -----
> From: "Michael Nestler" <mn...@gmail.com>
> To: <co...@jakarta.apache.org>
> Sent: Thursday, April 07, 2005 1:08 PM
> Subject: [JXPath] Context Namespace-Relative Queries (v1.2)
> 
> > Hello,
> >
> > I recently had to switch from JXPath 1.1 to 1.2 in order to benefit
> > from some bug fixes. I am using JDOM 1.0. It appears that JXPath's
> > behavior regarding namespaces in JDOM trees changed and became less
> > convenient and flexible.
> >
> > I have documents like this:
> >
> > <html xmlns="http://www.w3.org/1999/xhtml">
> >  <table>
> >    <tr>
> >      <td>page</td>
> >      <td>type</td>
> >      <td>comment</td>
> >    </tr>
> >    <tr>
> >      <td><a href="/Home"/></td>
> >      <td>conf</td>
> >      <td>Home Page</td>
> >    </tr>
> >    <tr>
> >      <td><a href="/ToolBar"/></td>
> >      <td>conf</td>
> >      <td>Tool Bar</td>
> >    </tr>
> >  </table>
> > </html>
> >
> > The namespace of the root element is variable and might be the XHTML
> > namespace, another namespace, or no namespace at all. The table
> > structure is always the same, and cell values vary. And I have some
> > code that executes the following query:
> >
> > SAXBuilder sax = new SAXBuilder();
> > Document doc = sax.build(new StringReader(...);
> > Element rootElement = doc.getRootElement();
> > JXPathContext ctx = JXPathUtil.newContext(rootElement);
> > String value = ctx.getValue("/table/tr[2]/td[2]");
> >
> > This worked fine with JXPath 1.1, but it doesn't work anymore with
> > 1.2. The new JXPath version throws an exception:
> >
> > org.apache.commons.jxpath.JXPathException: No value for xpath:
> > /table/tr[2]/td[2]
> > at
> > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:344)
> > at
> > org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:280)
> >
> > Why would this not work, considering that all the DOM nodes live in
> > the same namespace - the namespace of the context bean (root element)?
> > It appears that I can register the XHTML namespace, but then I have to
> > use a prefix for every element name in my query - and it won't work if
> > the namespace is not set or is different (that's possible in my app).
> >
> > Is there a solution to this problem, i.e. is there a way to make
> > JXPath interpret the root element's namespace as the default namespace
> > requiring no prefix in XPath queries?
> >
> > Thanks in advance,
> > -Michael
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: commons-user-help@jakarta.apache.org
> >
> >
> >
> >
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org


Re: [JXPath] Context Namespace-Relative Queries (v1.2)

Posted by Dmitri Plotnikov <dm...@apache.org>.
Michael,

You are not the first to raise this issue.  See for example the discussion 
in this bug report:
http://issues.apache.org/bugzilla/show_bug.cgi?id=32360

I think it's time we finally resolve the problem.

We have come up with three alternative solutions so far:

1. Using "null" for namespace prefix.  I don't necessarily like the idea - 
it feels atrificial and it blocks access to elements that have no namespace 
at all.

2. We introduce this new method on JXPathContext:

   context.registerDefaultNamespace(ns);

Then whenever a name is used without prefix in an XPath, this default 
namespace is assumed.  This is effectively the same as 1, except that 
aestetically this looks better.  Unfortunately this solution has the same 
problem: you can no longer reference elements that really don't have any 
namespace.

3. We introduce this other method on JXPathContext:
   context.setNamespaceIgnored(ns, boolean)

This would allow us to register one or multiple namespaces that should be 
ignored altogether.  Let's say
 - you call context.setNamespaceIgnored("abc", true)
 - you have a document that looks like this:

 <foo xmlns:names="abc">
   <a>y</a>
   <names:a>x</names:a>
 </foo>

- and you try to resolve the xpath "//a"

This path will return both elements: x and y, one because it does not have a 
namespace and the other because its namespace is ignored.

This third option is my favorite.

What do you think?

Thanks,

- Dmitri



----- Original Message ----- 
From: "Michael Nestler" <mn...@gmail.com>
To: <co...@jakarta.apache.org>
Sent: Thursday, April 07, 2005 1:08 PM
Subject: [JXPath] Context Namespace-Relative Queries (v1.2)


> Hello,
>
> I recently had to switch from JXPath 1.1 to 1.2 in order to benefit
> from some bug fixes. I am using JDOM 1.0. It appears that JXPath's
> behavior regarding namespaces in JDOM trees changed and became less
> convenient and flexible.
>
> I have documents like this:
>
> <html xmlns="http://www.w3.org/1999/xhtml">
>  <table>
>    <tr>
>      <td>page</td>
>      <td>type</td>
>      <td>comment</td>
>    </tr>
>    <tr>
>      <td><a href="/Home"/></td>
>      <td>conf</td>
>      <td>Home Page</td>
>    </tr>
>    <tr>
>      <td><a href="/ToolBar"/></td>
>      <td>conf</td>
>      <td>Tool Bar</td>
>    </tr>
>  </table>
> </html>
>
> The namespace of the root element is variable and might be the XHTML
> namespace, another namespace, or no namespace at all. The table
> structure is always the same, and cell values vary. And I have some
> code that executes the following query:
>
> SAXBuilder sax = new SAXBuilder();
> Document doc = sax.build(new StringReader(...);
> Element rootElement = doc.getRootElement();
> JXPathContext ctx = JXPathUtil.newContext(rootElement);
> String value = ctx.getValue("/table/tr[2]/td[2]");
>
> This worked fine with JXPath 1.1, but it doesn't work anymore with
> 1.2. The new JXPath version throws an exception:
>
> org.apache.commons.jxpath.JXPathException: No value for xpath:
> /table/tr[2]/td[2]
> at 
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:344)
> at 
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.getValue(JXPathContextReferenceImpl.java:280)
>
> Why would this not work, considering that all the DOM nodes live in
> the same namespace - the namespace of the context bean (root element)?
> It appears that I can register the XHTML namespace, but then I have to
> use a prefix for every element name in my query - and it won't work if
> the namespace is not set or is different (that's possible in my app).
>
> Is there a solution to this problem, i.e. is there a way to make
> JXPath interpret the root element's namespace as the default namespace
> requiring no prefix in XPath queries?
>
> Thanks in advance,
> -Michael
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-user-help@jakarta.apache.org
>
>
>
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-user-help@jakarta.apache.org