i am trying to create an RssFeed using java this is the class i use
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(endS开发者_运维技巧ection);
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);
}
}
But i get the following error
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)
what does it mean?
It means that the code is trying to write DTD information outside of where DTD info is legal in XML documents.
A DTD (Document Type Definition) describes the allowed structure (and possibly content) of the document. I think DTD info must appear before the root node of the document (in the prolog).
Looking at the code you've provided, I think that there are numerous places where the endSection
variable is written to the writer. endSection
looks like it contains a DTD declaration. Try removing the lines that write endSection
after the very first one.
My answer is extension of Brabster
XMLEvent endSection = eventFactory.createDTD(XML_BLOCK);
StartDocument startDocument = eventFactory.createStartDocument();
writer.add(startDocument);
writer.add(endSection);
For StartDocument
, endSection
is correct. But
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"));
精彩评论