java - 创建 RSS 源 XML 文件时出错 - Java

标签 java xml rss

我正在尝试使用 java 创建 RssFeed 这是我使用的类

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)

这是什么意思?

最佳答案

这意味着代码正在尝试在 XML 文档中 DTD 信息合法的范围之外写入 DTD 信息。

一个DTD (文档类型定义)描述了文档允许的结构(以及可能的内容)。我认为DTD信息必须出现在文档的根节点之前(在序言中)。

查看您提供的代码,我认为有很多地方将 endSection 变量写入编写器。 endSection 看起来它包含一个 DTD 声明。尝试删除第一行之后写入 endSection 的行。

关于java - 创建 RSS 源 XML 文件时出错 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962115/

相关文章:

java - 如何从Oracle返回列号到Java

java - jsoup 代码可以在 Java 中运行,但不能在 Android 中运行 - NullpointerException

c# - 从 PostAsync() 读取 XML 响应

python - django 替代 tiny tiny rss

c# - 良好的 C#.NET 解决方案来管理频繁的数据库轮询

java - 我在这里做错了什么?方法不起作用

java - Spring 启动 : Exclude auto configuration based on environment variable

java - org.xml.sax.SAXParseException : cvc-complex-type. 2.4.c: 匹配的通配符是严格的

java - STaX 解析器表现不同

rss - 实时或几乎实时获取 RSS 的最佳方式是什么