Go Back   Velocity Reviews > Newsgroups > XML
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

Reply

XML - JDK1.5 Xpath problem

 
Thread Tools Search this Thread
Old 09-15-2006, 05:12 PM   #1
Default JDK1.5 Xpath problem


Hi there,

I'm using, for the first time, the JDK1.5 Xpath API. I need to find
elements in a Hibernate-generated .hbm.xml file. These files come with
a <!DOCTYPE header mentioning a remote URL. The Xpath parser fetches
the URL from the hibernate.sourceforge site. So far so good.

However, if I unplug the network, I get (after a *long* timeout) a
java.net.SocketException. I looked around and I found out that I have
to define a class implementing EntityResolver to change the default
behaviour (i.e., fetch the DTD over the net) and obtain an InputSource
from it. Something along the lines of:

public class UriTransform implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) {
return new InputSource(new StringReader(""));
}
}

Now my problem is: How do I do it? Neither in javax.xml.xpath.XPath nor
in javax.xml.xpath.XPathFactory did I find an appropriate place nor did
I find a method to gain access to the underlying SAX parser. Here's my
code:

XPath xpath = XPathFactory.newInstance().newXPath();
final String expression = "//property";
final String completePath = ... //file path
InputSource inputSource = new InputSource(completePath);
DTMNodeList nodes = (DTMNodeList) xpath.evaluate(expression,
inputSource, XPathConstants.NODESET);

Any ideas?
TIA
andy



abcd_68@yahoo.co.uk
  Reply With Quote
Old 09-15-2006, 06:07 PM   #2
Martin Honnen
 
Posts: n/a
Default Re: JDK1.5 Xpath problem



wrote:


> However, if I unplug the network, I get (after a *long* timeout) a
> java.net.SocketException. I looked around and I found out that I have
> to define a class implementing EntityResolver to change the default
> behaviour (i.e., fetch the DTD over the net) and obtain an InputSource
> from it.


> Now my problem is: How do I do it? Neither in javax.xml.xpath.XPath nor
> in javax.xml.xpath.XPathFactory did I find an appropriate place nor did
> I find a method to gain access to the underlying SAX parser.


I don't know how to do it if you pass an InputSource to the evaluate
method. You can however also pass in an object where the object is a W3C
DOM Node. And if you look at DocumentBuilder it has a method
setEntityResolver. That should allow you to create a DOM Document
without fetching the DTD from the remote host, and you can then pass in
the Document to the evaluate method. I am not sure a DOM Node/Document
is the most efficient data structure to do XPath on but at least that
approach might work for your problem.

--

Martin Honnen
http://JavaScript.FAQTs.com/
  Reply With Quote
Old 09-15-2006, 06:52 PM   #3
Joseph Kesselman
 
Posts: n/a
Default Re: JDK1.5 Xpath problem

One way around this is to instantiate the parser yourself, configure it
appropriately, then pass it to the transformer wrapped in a SAXSource.

(There ought to be a way to pass an entity resolver/URI resolver through
the XPath APIs, but I'm having trouble finding it.)
  Reply With Quote
Old 09-16-2006, 12:23 PM   #4
abcd_68@yahoo.co.uk
 
Posts: n/a
Default Re: JDK1.5 Xpath problem

Martin Honnen wrote:
> You can however also pass in an object where the object is a W3C
> DOM Node.


Thank you so much Martin, that actually fixed my problem! The following
code now works with and without a network connection:
---------------------------------
DocumentBuilder db =
DocumentBuilderFactory.newInstance().newDocumentBu ilder();
db.setEntityResolver(new UriTransform());
final String completePath = //file path
Document doc = db.parse(new File(completePath));
XPath xpath = XPathFactory.newInstance().newXPath();
final String expression = "//property";
DTMNodeList nodes = (DTMNodeList) xpath.evaluate(expression, doc,
XPathConstants.NODESET);
---------------------------------

  Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump