Janlin,

Most answers to your question are in the FAQ and documentation.

You need to set a parser property to being able to parse UNC.

set the following property to false.

http://apache.org/xml/features/standard-uri-conformant


The DocumentBuilderFactory interface contains a setAttribute(String,Object) method which may provide a means to set features and properties on the underyling parser. However, it cannot be relied upon. Therefore, you must use the Xerces DOMParser object directly. For example:



import org.apache.xerces.parsers.DOMParser; import org.xml.sax.SAXException;

DOMParser parser = new DOMParser();

try {
parser.setFeature(http://apache.org/xml/features/standard-uri-conformant,
false);



} catch (SAXException e) { System.err.println("could not set parser feature"); }


It looks that there are problems with handling Windows UNC path (a path in the format of \\computer\share\filename). I would like to seek help on how to solve the problem.



Set the feature to false to process non conformant URI.


For the DocumentBuilder.parse() method, if a UNC path name is specified as the parameter, it will fail will error 'java.net.MalformedURLException: no protocol'.

Of course because it is not standard.

I tried two approaches. 1. set validating to false, but it looks that it still try to find the DTD file. 2. Using EntityResolver to resolve the DTD file, but it looks that the EntityResolver is never called (the print statement doesn't print anything). Why is this not called?


+ No setting validation to false won't work, because the parser needs to get the DTD even
when it does not validate to resolve entities.


+Entity Resolver gets called after finding non standard URI, by then you already have a
MalformedURL Exception.


Try what I said at beggining of note of setting parser feature.


Another possibility is to write a method that converts your non-conformant URI into a conformant one.
Notice that in your program the MalformedURL exception if probably thrown by Java when you
pass the path to URI class.



Regards,

Jeffrey Rodriguez
Silicon Valley



From: "Jianlin Chang" <[EMAIL PROTECTED]>
Reply-To: [EMAIL PROTECTED]
To: <[email protected]>, <[EMAIL PROTECTED]>
Subject: DOM parser problem with handling Windows UNC path for XML and DTD file
Date: Wed, 10 Sep 2003 12:31:36 -0400


It looks that there are problems with handling Windows UNC path (a path in the format of \\computer\share\filename). I would like to seek help on how to solve the problem.

For the DocumentBuilder.parse() method, if a UNC path name is specified as the parameter, it will fail will error 'java.net.MalformedURLException: no protocol'.
I have to use 'DocumentBuilder.parse(new File(uncPath))'. Then it got problems with find DTD file that the XML file uses:
<!DOCTYPE Users SYSTEM "Users.dtd">
The error is:
'Connection refused: connect'. From the stack trace, it looks that it trys to find the DTD file using FTP.


I tried two approaches. 1. set validating to false, but it looks that it still try to find the DTD file. 2. Using EntityResolver to resolve the DTD file, but it looks that the EntityResolver is never called (the print statement doesn't print anything). Why is this not called?

How can I solve the problem?

The sample code is enclosed.

xerces-j version I used is 2.0.2.

Thanks.


import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.*; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.Serializer; import org.apache.xml.serialize.SerializerFactory; import org.apache.xml.serialize.XMLSerializer;

public class TestDOM {
static public void main(String args[])
{
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setValidating(false);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
docBuilder.setEntityResolver(new MyEntityResolver());
// Document m_domDocument = docBuilder.parse(args[0]);
Document m_domDocument = docBuilder.parse(new java.io.File(args[0]));
} catch (ParserConfigurationException exn) {
System.err.println("Got ParserConfigurationException: " + exn.getMessage());
} catch (SAXException exn) {
System.err.println("Got SAXException: " + exn.getMessage());
} catch (java.io.IOException exn) {
System.err.println("Got IOException: " + exn.getMessage());
exn.printStackTrace();
}
}
}


class MyEntityResolver implements EntityResolver {
   public InputSource resolveEntity(String publicId, String systemId)
       throws SAXException, java.io.IOException
   {
       System.out.println("MyEntityResolver: " + systemId);
       java.io.FileInputStream fs = new java.io.FileInputStream(systemId);
       return new InputSource(fs);
   }
}

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


_________________________________________________________________
Need more e-mail storage? Get 10MB with Hotmail Extra Storage. http://join.msn.com/?PAGE=features/es



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



Reply via email to