IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML  >

Захват заголовков из удаленного RSS-файла

Получение доставленного контента, его преобразование и отображение результатов

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Николас Чейз (Nicholas Chase), президент, Chase and Chase, Inc.

23.09.2003

В данной статье показано, как получать доставляемый контент и преобразовывать его в заголовки для своего сайта. Официального формата для таких каналов не существует, поэтому агрегаторы часто сталкиваются с проблемой поддержки нескольких форматов. Ник также объясняет, как использовать XSL-преобразования для упрощения обработки различных форматов доставки.

По мере популяризации блогов информационная перегрузка стала намного выше. Сейчас у читателей так много сайтов, за которыми требуется следить, как никогда раньше, постоянное посещение всех этих сайтов практически невозможно. Частично проблему можно решить с помощью доставки контента, содержащего заголовки и основную информацию, доступную в виде отдельного канала. Сегодня большинство таких каналов использует XML-формат, называемый RSS, хотя имеются варианты его использования и даже потенциально конкурирующие форматы.

В этой статье объясняется, как использовать технологию Java для получения контента, доставляемого каналом, определения его типа, преобразования в HTML и отображения на Web-сайт. Этот процесс включает пять этапов:

  1. Получение XML-канала;
  2. Анализ канала;
  3. Определение соответствующей информации;
  4. Выполнение преобразования;
  5. Отображение результатов.

В данной статье описано создание страницы Java Server Page (JSP), получающей удаленный канал и преобразовывающей его с использованием компонента Java bean и XSLT, а затем включающей новую преобразованную информацию в страницу JSP. Данные концепции можно применять практически к любой Web-среде.

Исходный файл

Существует несколько расшифровок аббревиатуры RSS: RDF Site Summary, Rich Site Summary или другие менее тактичные варианты. В любом случае практически используется не менее четырех версий RSS, начиная от довольно простой версии 0.91, не включающей пространства имен и налагающей жесткие ограничения на контент, до версии 2.0, включающей версии до 0.91 (допустимый файл версии 0.91 является допустимым и в версии 2.0) и позволяющей использовать пространства имен. Благодаря разрешению пространств имен, версия 2.0 позволяет поставщикам добавлять в каналы различные элементы, находящиеся в другом пространстве имен. Некоторые поставщики используют такую функцию для добавления информации с помощью Resource Definition Format (RDF).

Простой файл RSS 2.0 может выглядеть, примерно, как этот канал блога Адама Карри (Adam Curry) (см. раздел Ресурсы):


Листинг 1. Пример сообщения RSS 2.0
<?xml version="1.0"?>
<rss version="2.0">
 <channel>
  <title>Adam Curry: Adam Curry's Weblog</title>
  <link>http://www.blognewsnetwork.com/members/0000001/</link>
  <description>News and Views from Adam Curry</description>
  <language>en-us</language>
  <copyright>Copyright 2003 Adam Curry</copyright>
  <lastBuildDate>Thu, 24 Jul 2003 09:26:48 GMT</lastBuildDate>
  <docs>http://backend.userland.com/rss</docs>
  <generator>Radio UserLand v8.0.9b2</generator>
  <managingEditor>adam@curry.com</managingEditor>
  <webMaster>adam@curry.com</webMaster>
  <item>
   <title>weblog at work again</title>
   <link>
   http://www.blognewsnetwork.com/members/0000001/2003/07/24.html#a4158
   </link>
   <description><a href="http://radio.weblogs.com/0001014/images/2003/07/24/ad
amwheely.jpg"><img src="http://radio.weblogs.com/0001014/images/2003/07/24/
adamwheely.jpg" width="250" height="187.5" border="0" align="right" hspace="15" v
space="5" alt="A picture named adamwheely.jpg"></a>A few days ago I aske
d if anyone had taken pictures of me at the annual ...</description>
   <guid>
   http://www.blognewsnetwork.com/members/0000001/2003/07/24.html#a4158
   </guid>
   <pubDate>Thu, 24 Jul 2003 09:21:25 GMT</pubDate>
  </item>
  <item>
   <title>teens trouble with web</title>
   <link>
   http://www.blognewsnetwork.com/members/0000001/2003/07/23.html#a4156
   </link>
   <description>According to a report from Northumbria University, most teenagers
 lack the <a href="http://www.web-user.co.uk/news/news.php?id=33621">inform
ation gathering skills</a> needed for using the internet efficiently. This 
sounds like it shouldn't be happening in ...</description>
   <guid>
   http://www.blognewsnetwork.com/members/0000001/2003/07/23.html#a4156
   </guid>
   <pubDate>Wed, 23 Jul 2003 17:36:23 GMT</pubDate>
  </item>
...
 </channel>
</rss>

Для преобразования этого канала в HTML-формат его можно обработать с использованием XSL-преобразований.



В начало


Основная таблица стилей

Основная цель заключается в генерации HTML-текста, отображающего информацию упорядоченным образом, например, в виде списка ссылок, включенных в тело другой страницы. Фактический HTML-вывод будет выглядеть примерно следующим образом:


Листинг 2. HTML-вывод
<h2>Adam Curry: Adam Curry's Weblog</h2>
<h3>News and Views from Adam Curry</h3>
<ul>
<li>

  <a 
href="http://www.blognewsnetwork.com/members/0000001/2003/07/24.html#a4158">weblog 
at work again</a>
  <p><a href="http://radio.weblogs.com/0001014/images/2003/07/24/adamwheely.jpg">
<img src="http://radio.weblogs.com/0001014/images/2003/07/24/adamwheely.jpg" 
width="250" height="187.5" border="0" align="right" hspace="15" vspace="5" alt="A 
picture named adamwheely.jpg"></a>A few days ago I asked if anyone had taken 
pictures of me at the annual ...

</li>
<li>

  <a 
href="http://www.blognewsnetwork.com/members/0000001/2003/07/23.html#a4156">teens 
trouble with web</a>
  <p>According to a report from Northumbria University, most teenagers lack the 
<a href="http://www.web-user.co.uk/news/news.php?id=33621">information gathering 
skills</a> needed for using the internet efficiently. This sounds like it 
shouldn't be happening in ...

</li>
...
</ul>
			

Для создания такого HTML-кода из XML необходима таблица стилей XSLT:


Листинг 3. Простая таблица стилей
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>

<xsl:template match="/">
  <xsl:apply-templates select="//channel"/>
  <ul>
    <xsl:apply-templates select="//item"/>
  </ul>
</xsl:template>

<xsl:template match="channel">
    
<xsl:apply-templates select="../image"/>
 <h2><xsl:value-of select="title"/></h2>
 <h3><xsl:value-of select="description"/></h3>
</xsl:template>

<xsl:template match="item">
  <li>
    <xsl:element name="a">
      <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
      <xsl:value-of select="title" />
    </xsl:element>
    <p><xsl:value-of disable-output-escaping="yes" select="description" /></p>
  </li>
</xsl:template>

<xsl:template match="image">
  <xsl:element name="img">
    <xsl:attribute name="src"><xsl:value-of select="url"/></xsl:attribute>
    <xsl:attribute name="style">float:left; padding: 10px;</xsl:attribute>
  </xsl:element>
</xsl:template>

<xsl:template match="language">
</xsl:template>

</xsl:stylesheet>
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>

<xsl:template match="/">
  <xsl:apply-templates select="//channel"/>
  <ul>
    <xsl:apply-templates select="//item"/>
  </ul>
</xsl:template>

<xsl:template match="channel">
    
<xsl:apply-templates select="../image"/>
 <h2><xsl:value-of select="title"/></h2>
 <h3><xsl:value-of select="description"/></h3>
</xsl:template>

<xsl:template match="item">
  <li>
    <xsl:element name="a">
      <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
      <xsl:value-of select="title" />
    </xsl:element>
    <p><xsl:value-of disable-output-escaping="yes" select="description" /></p>
  </li>
</xsl:template>

<xsl:template match="image">
  <xsl:element name="img">
    <xsl:attribute name="src"><xsl:value-of select="url"/></xsl:attribute>
    <xsl:attribute name="style">float:left; padding: 10px;</xsl:attribute>
  </xsl:element>
</xsl:template>

<xsl:template match="language">
</xsl:template>

</xsl:stylesheet>

Фактически форма страницы полностью определяется пользователем, как и данные, которые требуется включить в эту страницу. В данном случае просто создается маркированный список записей с названием (при его наличии) со ссылками на исходные сообщения и описанием каждого сообщения.

Для выполнения преобразования необходимо создать страницу JSP.



В начало


Основная JSP-страница

Существует множество способов преобразования XML-данных. В данной статье будет показано, как создать JSP-страницу, передающую канал для преобразования в компонент Java bean. Данный компонент создает статический файл, который JSP-страница включает в тело страницы. (Причина создания статического файла подробней будет объяснена далее в разделе о кэшировании).

Сама страница довольно проста:


Листинг 4. Страница JSP
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<jsp:useBean id="rssBean" scope="request" class="RSSProcessor">
<% 
   rssBean.setRSSFile(
        "http://wolk.datashed.net/users/adam@curry.com/curryCom.xml");
 %>
</jsp:useBean>

<html>
<head>
   <title>Syndicated Feeds</TITLE>
</head>
<body>
   <jsp:include page="headlines.html" flush="true"/>
</body>
</html>

Просто создается экземпляр класса RSSProcessor . Так как экземпляр включен в элемент useBean, при создании объекта выполняется метод setRSSFile(). Этот метод создает страницу headlines.html, которую JSP-страница включает в выходные данные.

Далее создадим компонент, выполняющий преобразование.



В начало


Преобразование файла

Компонент Java представляет собой просто Java-класс с методами get и set. В данном случае метод set setRSSFile() также включает код, выполняющий преобразование файла:


Листинг 5. Преобразование канала
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileOutputStream;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;

public class RSSProcessor {

  public RSSProcessor(){ }

  String _RSSFile;
   
  public String getRSSFile(){
       return _RSSFile;
  }

  public void setRSSFile(String fileName){

       try {
            
          StreamSource source = new StreamSource(fileName);

          StreamSource finalStyle = new StreamSource("final.xsl");

          String outputURL = "headlines.html";
          StreamResult result = new StreamResult(new 
                                    FileOutputStream(outputURL));

          TransformerFactory transFactory = TransformerFactory.newInstance();
          Transformer transformer = transFactory.newTransformer(finalStyle);   
          transformer.transform(source, result);

       } catch (Exception e) {
           e.printStackTrace();        
       }
  }

   
}

Этот метод просто принимает входной источник, которым в данном случае является RSS-канал, и преобразует его с использованием таблицы стилей final.xsl в файл headlines.html.

В принципе это можно представить следующей схемой: получение файла, его преобразование и отображение результатов. В реальности приходится решать еще и другие вопросы.



В начало


Настройка нескольких форматов

Если бы все файлы RSS-каналов были такими простыми, то больше ничего не нужно было бы делать. К несчастью, все совсем не так. Различные поставщики и наборы инструментов могут предоставлять дополнительную информацию или заменять базовую информацию на сведения RDF или данные модулей других пространств имен, что приводит к жалобам относительно сложности поддержки RSS из-за всех этих вариаций. Использование XSL-преобразований не должно выполняться таким образом.

Например, канал RSS 2.0 также может содержать информацию RDF, как в этом канале Typographica:


Листинг 6. Фрагмент примера сообщения RSS 2.0 с RDF
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" 
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>Typographica</title>
    <link>http://typographi.ca/</link>
    <description>A daily journal of typography featuring news, observations, 
and open commentary on fonts and typographic design.</description>
    <dc:language>en-us</dc:language>
    <dc:creator>Stephen Coles</dc:creator>
    <dc:rights>Copyright 2003</dc:rights>
    <dc:date>2003-07-24T00:00:52-08:00</dc:date>
    <admin:generatorAgent rdf:resource="http://www.movabletype.org/?v=2.63" />
    <admin:errorReportsTo rdf:resource="mailto:scoles@gomakecontact.com" />
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>

    <item>
      <title>Hot and Cold Fonts</title>
      <link>http://typographi.ca/000643.php</link>
      <description>LettError have developed a multiple master font 
for the Design Institute of the University of Minnesota that varies 
along three...</description>
      <guid isPermaLink="false">643@http://typographi.ca/</guid>
      <content:encoded><![CDATA[<p><a href="http://www.letterror.com/">
LettError</a> have developed a multiple master font for the 
<a href="http://design.umn.edu/">Design Institute</a> of the University of 
Minnesota that varies along three dimensions: formality, informality, and 
"weirdness." (It's apparently possible to be 100% formal and 100% informal at 
the same time.)  As the New York Times...]]></content:encoded>
      <dc:subject></dc:subject>
      <dc:date>2003-07-24T00:00:52-08:00</dc:date>
    </item>

    <item>
      <title>Textura Digita</title>
      <link>http://typographi.ca/000642.php</link>
      <description>CNN reports that the Gutenberg Bible is now available 
on the web via the Ransom Center at the University of...</description>
      <guid isPermaLink="false">642@http://typographi.ca/</guid>
      <content:encoded><![CDATA[<p><a href=
"http://www.cnn.com/2003/TECH/internet/07/23/digital.scripture.ap/index.html">
CNN reports</a> that the Gutenberg Bible is now available on the web via the 
<a href="http://www.hrc.utexas.edu/exhibitions/permanent/gutenberg/">Ransom 
Center</a> at the University of Texas.</p>
...]]></content:encoded>
      <dc:subject></dc:subject>
      <dc:date>2003-07-23T13:16:15-08:00</dc:date>
    </item>

    <item>
      <title>Fight! Fight! Fight!</title>
      <link>http://typographi.ca/000640.php</link>
      <description>Angry because you had to miss TypeCon ’03? 
Work out that aggression with Helvetica vs. Arial....</description>
      <guid isPermaLink="false">640@http://typographi.ca/</guid>
      <content:encoded><![CDATA[<p>Angry because you had to miss 
<a href="http://www.typecon2003.com/">TypeCon ’03</a>? Work out that 
aggression with <a href="http://www.engagestudio.com/helvetica/">Helvetica vs. 
Arial</a>.</p>]]></content:encoded>
      <dc:subject></dc:subject>
      <dc:date>2003-07-22T08:52:36-08:00</dc:date>
    </item>
...
  </channel>
</rss>

Обратите внимание, что этот канал фактически содержит два различных описания контента. Первое находится в элементе description, а второе - в элементе encoded, являющемся частью пространства имен http://purl.org/rss/1.0/modules/content/ . Здесь показано различие обработки информации различными каналами. Блог Адама Карри просто кодирует информацию, например, в виде ссылок и помещает ее в элемент description , тогда как канал Typographica (или скорее набор инструментов, создающий канал Typographica) предоставляет версию без разметки в элементе description и полную версию в элементе encoded с использованием конструкции CDATA .

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

Например, можно создать таблицу стилей, принимающей таблицу стилей RSS 2.0. При обнаружении элемента encoded он используется для замены всех элементов description:


Листинг 7. Преобразование RDF-информации
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<rss>
  <channel>
     <xsl:apply-templates select="rss/channel" />
  </channel>
</rss>
</xsl:template>

<xsl:template match="title|link|/rss/channel/description|image|text()">
   <xsl:copy-of select="." />
</xsl:template>

<xsl:template match="item" >
   <item>
      <title><xsl:value-of select="title" /></title>
      <link><xsl:value-of select="link" /></link>
      <description><xsl:value-of select="description" /></description>
   </item>
</xsl:template>

<xsl:template match="item[encoded]" >
   <item>
      <title><xsl:value-of select="title" /></title>
      <link><xsl:value-of select="link" /></link>
      <description><xsl:value-of select="encoded" /></description>
   </item>
</xsl:template>
    
</xsl:stylesheet>

Эта таблица стилей создает копии элементов, необходимых для финальной таблицы стилей , например, название и описание канала, и создает копию элемента item с соответствующим описанием.

Остается только встроить новый документ в финальное преобразование:


Листинг 8. Связывание с преобразованием
...
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class RSSProcessor {
...
 public void setRSSFile(String fileName){

      try {

         StreamSource interimSource = new StreamSource(fileName);
            
         String XSLSheetName = "2.0.xsl";
       StreamSource style = new StreamSource(XSLSheetName);

       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
       DocumentBuilder db = dbf.newDocumentBuilder();
       Document interimDoc = db.newDocument();
       DOMResult interimResult = new DOMResult(interimDoc);

         TransformerFactory transFactory = TransformerFactory.newInstance();
         Transformer interimTransformer = null;
       interimTransformer = transFactory.newTransformer(style);
       interimTransformer.transform(interimSource, interimResult);

       DOMSource source = new DOMSource(interimDoc);

         StreamSource finalStyle = new StreamSource("final.xsl");

         String outputURL = "headlines.html";
         StreamResult result = new StreamResult(new 
                                   FileOutputStream(outputURL));

         Transformer transformer = transFactory.newTransformer(finalStyle);   
         transformer.transform(source, result);

      } catch (Exception e) {
          e.printStackTrace();
      }
 }
}

Взгляните на этот шаг. Прежде всего, создается преобразование interim, принимающее исходный канал и преобразующее его в соответствии с таблицей стилей interim, имеющей в листинге 7 имя 2.0.xsl. Результат этого первого преобразования передается не в файл, а в объект DOM Document , который затем передается в виде источника для второго преобразования.

Имя таблицы стилей interim, 2.0.xsl, выбрано намеренно. Использование названия в соответствии с версией позволяет создать более гибкую систему.



В начало


Выбор версии

Если разрешены другие форматы, то можно создать систему, которая перед обработкой канала проверяет его версию. В конце концов, только каналы RSS 1.0 и 2.0 могут включать элементы RDF, поэтому обрабатывать другие каналы не требуется. Но как определить, какую применить версию?

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


Листинг 9. Выбор таблицы стиля
...
import org.xml.sax.InputSource;
import org.w3c.dom.Element;

public class RSSProcessor {
...
   public void setRSSFile(String fileName){

         try {
            
            InputSource docFile = new InputSource (fileName);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();

            Document inputDoc = db.parse(docFile);
           Element rss = inputDoc.getDocumentElement();
           String version = null;
           if (rss.getNodeName().equals("rss")){
               version = rss.getAttribute("version");
               if (version == null) {
                  version = "0.91";
               }
           } else if (rss.getNodeName().equals("feed")){
              version = "echo";
           }
            
            String XSLSheetName = version+".xsl";
            StreamSource style = new StreamSource(XSLSheetName);

            DOMSource interimSource = new DOMSource(inputDoc);

            Document interimDoc = db.newDocument();
            DOMResult interimResult = new DOMResult(interimDoc);

            TransformerFactory transFactory = TransformerFactory.newInstance();
            Transformer interimTransformer = null;
           if (version.equals("0.91")){
              interimTransformer = transFactory.newTransformer();
           } else {
               interimTransformer = transFactory.newTransformer(style);
           }
            interimTransformer.transform(interimSource, interimResult);


            DOMSource source = new DOMSource(interimDoc);
            StreamSource finalStyle = new StreamSource("final.xsl");

            String outputURL = "headlines.html";
            StreamResult result = new StreamResult(new 
                                      FileOutputStream(outputURL));

            Transformer transformer = transFactory.newTransformer(finalStyle);   
            transformer.transform(source, result);

         } catch (Exception e) {
             e.printStackTrace();
        
         }
   }
  
}

В данном случае канал загружается и проверяется его версия RSS, затем в качестве имени файла используется номер версии. Преимущество заключается в том, что при выходе новой версии RSS можно расширить приложение, просто добавив новую таблицу стилей. Обратите внимание, что добавлена проверка Echo, Atom или другие возможные названия конкурентов RSS, и что можно настроить поддержку таких каналов при их изменении с помощью простого изменения таблицы стилей echo.xsl.

Преимущество заключается в том, что данная таблица стилей interim является полностью обобщенной. Таблица стилей "2.0 - .91" подходит для всех и в любых случаях, изменения в окончательных выходных данных можно выполнить с помощью редактирования файла final.xsl. При этом не важно, поддерживается одна версия или сто.

Таблица стилей final.xsl предназначена для простого канала со стилем 0.91, поэтому если используется такой канал, то можно пропустить таблицу стилей при преобразовании interim. При этом создается преобразование идентичности, в которое документ передается "как есть".

При этом решается проблема нескольких версий, но остается еще один вопрос: взаимосовместимость.



В начало


Кэширование канала

Эта система работает замечательно на отдельном сервере, доступ к которому имеет только разработчик, но в реальности это непрактично (и неприлично) извлекать канал каждый раз, когда кто-то хочет его прочитать. Вместо этого необходимо создать систему с определенной временной задержкой, чтобы в недавно извлеченном канале использовался существующий файл headlines.html.

Для этого можно воспользоваться преимуществами, присущими Java-приложениям. Переменная static, представляющая канал, извлеченный последний раз, остается постоянной для всех экземпляров класса RSSProcessor , поэтому перед фактическим извлечением канала можно сравнить текущее время со временем последного извлечения канала:


Листинг 10. Выбор таблицы стиля
import java.util.Date;

public class RSSProcessor {
...
   static Date _LastUpdated = new Date();
   public Date getLastUpdated(){
         return _LastUpdated;
   }
      
   public void setRSSFile(String fileName){

      Date now = new Date();
      long diff = now.getTime() - _LastUpdated.getTime();

      double interval = .5;
      if ((diff == 0) || (diff > (interval * 60 * 1000))){
           _LastUpdated = now;
     
         try {
            
            InputSource docFile = new InputSource (fileName);
...
            Transformer transformer = transFactory.newTransformer(finalStyle);   
            transformer.transform(source, result);

         } catch (Exception e) {
             e.printStackTrace();
         }
      }  
   }
   
}

При первой инициализации сервером класса RSSProcessor _LastUpdated инициализируется с текущей датой. По существу, в то же самое время сервер выполняет метод setRSSFile(). Так как разность между текущим временем и временем _LastUpdated равна нулю, выполняется преобразование.

При следующем вызове страницы создается новый экземпляр RSSProcessor. Так как переменная _LastUpdated является статической, новый экземпляр находит существующее значение переменной _LastUpdated без ее инициализации. Значение interval измеряется в минутах, разность между временем _LastUpdated и текущим временем - в миллисекундах. Если прошло времени меньше значения interval, то ничего не происходит. Файл headlines.html не обновляется, поэтому сервер использует старую версию файла.

С другой стороны, если пройденное время превысило значение interval, _LastUpdated получает текущее время, которое передается в любые следующие объекты RSSProcessor , компонент выдает для преобразования новую копию канала.



В начало


Заключение

В данной статье показано, как создавать программу чтения доставляемого канала, извлекающую отдельный удаленный канал, преобразовывать его с использованием XSLT и отображать в составе Web-страницы. Систему можно настроить для нескольких типов каналов с помощью таблиц стилей XSLT.

Приложение использует DOM Document для анализа канала и определения соответствующей таблицы стилей, можно расширить модель, переместив некоторую логику во внешнюю таблицу стилей. Можно также настроить систему для выдачи более одного канала, возможно, на основе выбора пользователей, каждый из которых создает собственный кэшированный файл. Таким же образом можно позволить пользователям определять интервал между поиском канала.



Ресурсы



Об авторе

Photo of Nicholas Chase

Николас Чейз (Nicholas Chase), автор Studio B , занимается разработкой Web-сайтов для таких компаний, как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Ник работал школьным преподавателем физики, управляющим предприятия по утилизации малоактивных радиоактивных отходов, редактором онлайнового журнала по научной фантастике, специалистом по мультимедиа и инструктором Oracle. Не так давно он занимал пост главного директора по технологиям компании Site Dynamics Interactive Communications в Клируотере, Флорида, США. Автор четырех книг по Web-разработке, включая XML Primer Plus (издательство Sams). Ник всегда рад получить комментарии от читателей, которые можно присылать по адресу nicholas@nicholaschase.com.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.
    IBM в России Конфиденциальность Контакты