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



         

Класс NewsUpKeep - часть 3


Затем, как показано в листинге 8.30, пишется новый тег <NewsItem>, за которым следует заголовок сообщения, указывается дата и приводятся краткая и полная версии текста сообщения. Для того чтобы записать старые элементы <NewsItan>, вызывается метод writeNewsNode. После закрытия временного файла старый файл XML удаляется, а временный файл получает имя. Следующий раз, когда этот файл будет запрошен, класс DOMIibrary по изменившейся метке даты модификации файла (timestamp) определит, что нужно считывать новый файл.

Листинг 8.30. Метод addltem, продолжение (NewsllpKeep.java)

out.print("<Newsitem timestamp=\""); out.print( timeInDays() + "\" topic=\""); out.print( formatTopics( topics ) ); out.println( "\" author=\"" + author + "\" id=\"" + idVal + "\" >"); // end of <Newsitem .. > out.println("<head>" + head.trim() + "</head>" ); out.println("<date>" + date.trim() + "</date>" ); out.println("<short><![CDATA["); out.println( shrtStr.trim() ); out.println("]]></short>"); out.println("<long><![CDATA["); out.println( longStr ); out.println("]]></long>"); out.println("</Newsitem>"); for( int i = 0 ; i < itemNodes.length ; i++ ){ writeNewsNode(out, (Element)itemNodes[i] ); } out.println("</Newsfile>"); out.flush(); out.close(); File forig = new File( newsFileName ); DOMlibrary library = DOMlibrary.getLibrary(); // to prevent overlapping XML file operations synchronized( library ){ forig.delete(); if( !f.renameTo( forig )){ System.out.println("NewsUpkeep.addItem rename failed") ; } } }

Метод writeNewsNode, который записывает отдельный элемент <Newsitem>, показан в листинге 8.31.

Листинг 8.31. Метод, который записывает отдельный элемент из DOM (NewsllpKeep.java)

// write a <Newsitem Element duplicating the attributes public void writeNewsNode(PrintWriter out, Element e) { NamedNodeMap nnm = e.getAttributes(); out.print("<Newsitem " ) ; //timestamp=\""); int i ; for( i = 0 ; i < nnm.getLength() ; i++ ){ Attr na = (Attr) nnm.item(i); // Attr extends Node String atr = na.getName(); String val = na.getValue(); out.print( atr ); out.print("=\""); out.print( val ); out.print("\" "); } out.println(">"); NodeList nl = e.getChildNodes(); int ct = nl.getLength(); for( i = 0 ; i < ct ; i++ ){ Node nde = nl.item( i ); if( nde instanceof Element ){ Element ce = (Element)nde; String name = ce.getTagName(); out.print("<" + name + ">"); NodeList chnl = ce.getChildNodes() ; if( chnl.getLength() == 0 ) continue ; Node chn = chnl.item(0); if( name.equals("long") || name.equals("short") ){ out.print("<![CDATA["); out.println( chn.getNodeValue().trim() ); out.print("]]>"); } else { out.print( chn.getNodeValue() ); } out.println("</" + name + ">"); } } // loop over <Newsitem> child nodes out.println("</Newsitem>"); } }

На основе нашего опыта добавления новых сообщений с помощью сервлета CompanyNewsServ вы можете сначала создать полный текст сообщения в текстовом редакторе, а затем при работе с формой HTML для ввода текста просто вставить его в форму с помощью команд вырезания и вставки.




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