【问题标题】:XML Parsing Error: junk after document element - RESTXML 解析错误:文档元素后出现垃圾 - REST
【发布时间】:2012-08-30 06:09:26
【问题描述】:

我正在开发一个 RESTful Web 服务,它会返回一个 RSS 提要列表,有人将这些提要列表添加到我之前实现的提要列表中。

现在,如果我返回 TEXT_PLAIN 回复,浏览器中会显示得很好,但当我尝试返回 APPLICATION_XML 回复时,会出现以下错误:

XML 解析错误:文档元素后出现垃圾 位置:http://localhost:8080/Assignment1/api/feedlist 第 1 行,第 135 列:SMH 头条新闻http://feeds.smh.com.au/rssheadlines/top.xmlUTS 图书馆新闻http://www.lib.uts.edu.au/news/feed/all

这是代码——我不知道为什么它没有返回格式良好的 XML 页面(我也尝试过用新行和空格(缩进)格式化 XML 回复——当然这不起作用):

package au.com.rest;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.ws.rs.*;
import javax.ws.rs.core.*;
import au.edu.uts.it.wsd.*;


@Path("/feedlist")
public class RESTFeedService {

String feedFile = "/tmp/feeds.txt"; 
String textReply = "";
String xmlReply = "<?xml version=\"1.0\"?><feeds>";
FeedList feedList = new FeedListImpl();

@GET
@Produces(MediaType.APPLICATION_XML)
public String showXmlFeeds() throws FileNotFoundException, IOException
{

    feedList.load(feedFile);
    for (Feed f:feedList.list()){
        xmlReply += "<feed><name>" + f.getName() + "</name>";
        xmlReply += "<uri>" + f.getURI() + "</uri></feed></feeds>";
    }

    return xmlReply;
}

}

【问题讨论】:

    标签: java xml rest


    【解决方案1】:

    编辑:我现在发现了眼前的问题。您正在关闭每个输入元素上的 feeds 元素:

    for (Feed f:feedList.list()){
        xmlReply += "<feed><name>" + f.getName() + "</name>";
        xmlReply += "<uri>" + f.getURI() + "</uri></feed></feeds>";
    }
    

    最小的变化是:

    for (Feed f:feedList.list()){
        xmlReply += "<feed><name>" + f.getName() + "</name>";
        xmlReply += "<uri>" + f.getURI() + "</uri></feed>";
    }
    xmlReply += "</feeds>";
    

    ...但您仍应遵循以下建议。


    第一步 - 您需要进一步诊断问题。查看浏览器中的源代码,看看它到底在抱怨什么。您自己能看到 XML 中的问题吗?它看起来像什么?

    在不知道您正在使用的其余框架的情况下,这看起来可能是一个 与服务多个请求的单个实例有关的问题。出于某种原因,你有一个 instance 变量,你在你的方法中进行了变异。你为什么想这么做?如果为每个请求都创建了您的类的新实例,那应该不是问题 - 但我不知道是不是这样。

    作为第一个更改,请尝试移动此行:

    String xmlReply = "<?xml version=\"1.0\"?><feeds>";
    

    作为局部变量放入方法中。

    在那之后:

    • 将所有字段保密
    • 避免在这样的循环中使用字符串连接
    • 更重要的是,不要手动构建 XML - 使用 XML API 来完成。 (内置的 Java API 不是很好,但有很多替代方案。)
    • 考虑这些字段中的哪些(如果有)是对象 的真正状态,而不是应该是局部变量的东西。你的对象在逻辑上到底有什么状态?

    【讨论】:

    • 感谢您的建议。我已将 xmlReply 声明移到 showXmlFeeds() 方法中。当我查看页面源代码时,它似乎向我显示了我需要的 XML 文档,尽管它都在一行中:SMH Top Headlinesfeeds.smh.com.au/rssheadlines/top.xml</uri></…图书馆新闻lib.uts.edu.au/news/feed/all</uri></feed></feeds>
    • @AlexM:嗯,是的,一切都在一行中 - 你没有任何东西可以插入换行符。但请阅读编辑以查看直接问题。其余的答案很重要……
    • 我刚刚注意到您的编辑,我现在将对其进行审核,再次感谢您的朋友-这非常有帮助-我以后会更加注意这一点。亲切的问候。
    猜你喜欢
    • 2010-11-24
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多