2010-06-02 3 views
1

내가 자바 를 사용하여 RssFeed을 만들려고하고이 내가 오류 만들기 RSS 피드 XML 파일 - 자바

import com.rssFeed.domain.RSS; 
import com.rssFeed.domain.RSSItem; 
import java.io.FileOutputStream; 
import java.util.Iterator; 
import javax.xml.stream.XMLEventFactory; 
import javax.xml.stream.XMLEventWriter; 
import javax.xml.stream.XMLOutputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.events.Characters; 
import javax.xml.stream.events.EndElement; 
import javax.xml.stream.events.StartDocument; 
import javax.xml.stream.events.StartElement; 
import javax.xml.stream.events.XMLEvent; 



public class RssBuilder { 

    private static String XML_BLOCK = "\n"; 
    private static String XML_INDENT = "\t"; 

    public static void BuildRss(RSS rss, String xmlfile) throws Exception { 

     XMLOutputFactory output = XMLOutputFactory.newInstance();   
     XMLEventWriter writer = output.createXMLEventWriter(new FileOutputStream(xmlfile)); 
     try 
     {     
     XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 
     XMLEvent endSection = eventFactory.createDTD(XML_BLOCK); 

     StartDocument startDocument = eventFactory.createStartDocument(); 
     writer.add(startDocument); 
     writer.add(endSection); 

     StartElement rssStart = eventFactory.createStartElement("", "", "rss"); 
     writer.add(rssStart); 
     writer.add(eventFactory.createAttribute("version", "2.0")); 
     writer.add(endSection); 

     writer.add(eventFactory.createStartElement("", "", "channel")); 
     writer.add(endSection); 

     createNode(writer, "title", rss.getTitle()); 
     createNode(writer, "description", rss.getDescription()); 
     createNode(writer, "link", rss.getLink()); 
     createNode(writer, "dateCreated", rss.getDateCreated().toString()); 

     createNode(writer, "language", rss.getLanguage()); 
     createNode(writer, "pubDate", rss.getPubDate().toString()); 
     createNode(writer, "dateModified", rss.getDateModified().toString()); 
     createNode(writer, "dateModified", rss.getDateModified().toString()); 
     createNode(writer, "pubDate", rss.getPubDate().toString()); 
     createNode(writer, "lastBuildDate", rss.getLastBuildDate().toString()); 
     createNode(writer, "language", rss.getLanguage().toString()); 
     createNode(writer, "rating", rss.getRating().toString()); 

     Iterator<RSSItem> iterator = rss.getRssItems().iterator(); 
     while (iterator.hasNext()) { 
      RSSItem entry = iterator.next(); 
      writer.add(eventFactory.createStartElement("", "", "item")); 
      writer.add(endSection); 

      createNode(writer, "title", entry.getTitle()); 
      createNode(writer, "description", entry.getDescription()); 
      createNode(writer, "link", entry.getLink()); 
      createNode(writer, "dateCreated", entry.getDateCreated().toString()); 
      createNode(writer, "pubDate", entry.getDateModified().toString()); 
      writer.add(eventFactory.createEndElement("", "", "item")); 
      writer.add(endSection); 
     } 

     writer.add(endSection); 
     writer.add(eventFactory.createEndElement("", "", "channel")); 
     writer.add(endSection); 
     writer.add(eventFactory.createEndElement("", "", "rss")); 

     writer.add(endSection); 
     writer.add(eventFactory.createEndDocument()); 
     writer.close(); 
     } 
     catch(Exception e) 
     { 
      writer.close(); 
     } 
    } 

    private static void createNode(XMLEventWriter eventWriter, String name, String value)throws XMLStreamException { 

     XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 
     XMLEvent endSection = eventFactory.createDTD(XML_BLOCK); 
     XMLEvent tabSection = eventFactory.createDTD(XML_INDENT); 

     StartElement sElement = eventFactory.createStartElement("", "", name); 
     eventWriter.add(tabSection); 
     eventWriter.add(sElement); 

     Characters characters = eventFactory.createCharacters(value); 
     eventWriter.add(characters); 

     EndElement eElement = eventFactory.createEndElement("", "", name); 
     eventWriter.add(eElement); 
     eventWriter.add(endSection); 
    } 

} 

를 사용하는 클래스입니다 그러나 나는 다음과 같은 오류를 얻을

type Exception report 

message 

descriptionThe server encountered an internal error() that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.xml.stream.XMLStreamException: Can not write DOCTYPE declaration (DTD) when not in prolog any more (state 2; start element(s) written) 

root cause 

javax.xml.stream.XMLStreamException: Can not write DOCTYPE declaration (DTD) when not in prolog any more (state 2; start element(s) written) 

무엇을합니까 평균?

답변

1

이것은 코드가 XML 문서에서 DTD 정보가 유효한 곳 밖에서 DTD 정보를 쓰려고한다는 것을 의미합니다.

DTD (문서 유형 정의)은 문서의 허용되는 구조 (가능하면 내용)를 설명합니다. DTD 정보는 프롤로그에서 문서의 루트 노드 앞에 나타나야한다고 생각합니다.

제공된 코드를 보면 endSection 변수가 작성자에게 쓰여지는 곳이 많다고 생각합니다. endSection에는 DTD 선언이 포함 된 것처럼 보입니다. 첫 번째 줄 이후에 endSection을 쓰는 줄을 제거해보십시오.

0

내 대답은 endSection이 올바른지, StartDocument를 들어

XMLEvent endSection = eventFactory.createDTD(XML_BLOCK); 
StartDocument startDocument = eventFactory.createStartDocument(); 
writer.add(startDocument); 
writer.add(endSection); 

Brabster

의 확장입니다. 그러나

StartElement rssStart = eventFactory.createStartElement("", "", "rss"); 
writer.add(rssStart); 
writer.add(eventFactory.createAttribute("version", "2.0")); 
writer.add(endSection); 
// --> here we will writer like this 
writer.add(eventFactory.createCharacters("\n"));