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



         

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


В листинге 9.5 показаны методы объекта XMLgrabber, которые применяются для создания и управления временными файлами.

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

// saveDir used for all private boolean renameTemp(String tmp, String saveN ) { File src = new File( saveDir, tmp ); File dest = new File( saveDir, saveN); dest.delete(); return src.renameTo( dest ); }

private void createTempXmlWriter() throws IOException { tfnxml = "$" + Integer.toString((int) System.currentTimeMillis()) + ".xml"; File tfile = new File( saveDir, tfnxml ); while( tfile.exists() ){ // hunt for unique name tfnxml = tfnxml + "X" ; tfile = new File( saveDir, tfnxml ); } // ok, unique file name in tfnxml, File tfile set up FileWriter fw = new FileWriter( tfile.getAbsolutePath() ); pw = new PrintWriter( fw ); }

private void createTempDtdWriter() throws IOException { tfndtd = "$" + Integer.toString((int) System.currentTimeMillis()) + ".dtd"; File tfile = new File( saveDir, tfndtd ); while( tfile.exists() ){ // hunt for unique name tfndtd = tfndtd + "X" ; tfile = new File( saveDir, tfndtd ); } // ok, unique file name in tfndtd, File tfile set up FileWriter fw = new FileWriter( tfile.getAbsolutePath() ); pw = new PrintWriter( fw ); }

Как показано в листинге 9.6, метод grabXml считывает строки текста из входного потока, создав соединение по нужному URL-адресу. Строка заголовка XML, содержащая ссылку на файл DTD, переформатируется методом reformDoctype, который заменяет URL на имя локального файла. Это делается для того, чтобы гарантировать, что синтаксический анализ файла XML будет проходить независимо от соединения с Интернетом.

Листинг 9.6. Метод grabXML считывает строки файла XML из заданного с помощью URL источника (XMLgrabber.java)

// at this point pw is open to a temp file private void grabXml() throws IOException { 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 ){ tmp = tmp.trim(); if( tmp.startsWith("<!DOCTYPE") ) { // change to use local copy tmp = reformDoctype( tmp ); } pw.println( tmp ); tmp = br.readLine(); } pw.close(); // does a flush() }




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