Электронный магазин на Java и XML




Получение файла XML - часть 5


В предположении, что метод ref ormDoctype корректно задает переменную dtdURL, метод grabDtd, показанный в листинге 9.7, загружает DTD в локальный временный файл. В этом листинге также показан служебный метод createURL, который устанавливает значение переменной экземпляра theURL.

Листинг 9.7. Метод grabDtd получает текущее определение moreovernews.dtd (XMLgrabber.java)

// at this point pw is open to a temp file for dtd private void grabDtd() throws IOException { System.out.println("grabDtd:" + dtdURL ); URLConnection urlC = theURL.openConnection(); urlC.setUseCaches( false ); urlC.setAllowUserInteraction(false); urlC.connect(); InputStream is = urlC.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader( isr ); String tmp = br.readLine() ; while( tmp != null ){ pw.println( tmp.trim() ); tmp = br.readLine(); } pw.close(); // does a flush() //System.out.println("grabDtd OK"); }

private boolean createURL(String str){ try { theURL = new URL( str ); return true ; }catch(MalformedURLException e){ return false ; } }

Как показано в листинге 9.8, метод reformDoctype извлекает ссылку на файл DTD из строки DOCTYPE, а затем устанавливает значения переменных dtdURL и dtdFname.

Листинг 9.8. Метод reformDocType модифицирует ссылку на DTD (XMLgrabber.java)

// string has doctype declaration, revise to //point to local version private String reformDoctype( String dts ){ int p1 = dts.indexOf( "http:"); // points at h if( p1 < 0 ) return dts ; // int p2 = dts.indexOf( '"', p1 ); int p3 = dts.lastIndexOf('/', p2); if( p3 < 0 ) return dts ; dtdURL = dts.substring( p1 , p2 ); dtdFname = dts.substring( p3 + 1, p2 ); // System.out.println("DTD url:" + dtdURL + "<"); // System.out.println("DTD fname:" + dtdFname + "<"); String tmp = dts.substring(0,p1); // includes " return tmp + dts.substring( p3 + 1 ); }

Так как процесс загрузки в некоторых точках может быть прерван, существует опасность накопления пустых или частично записанных временных файлов. Метод finalize, как показано в листинге 9.9, пытается удалить эти файлы, если они существуют. Если все идет нормально, переменные tfnxml и tfndtd должны содержать null и тогда попытки удалить временные файлы не происходит.

Листинг 9.9. Метод finalize может удалять временные файлы (XMLgrabber.java)

// last chance to clean up temp files if something failed public void finalize(){ if( tfnxml != null ){ new File( saveDir, tfnxml ).delete(); } if( tfndtd != null ){ new File( saveDir, tfndtd ).delete(); } } }

 




Содержание  Назад  Вперед