“在GAE中解析完全有效的XML时,不允许在序言中使用内容”

问题描述 投票:92回答:14

在过去的48个小时里,我一直对这个绝对令人毛骨悚然的bug感到头疼,所以我想我最终会把毛巾扔掉,尝试在这里问一下,然后再将笔记本电脑扔出窗户。

我正在尝试从对AWS SimpleDB的调用中解析响应XML。响应恢复正常。例如,它可能看起来像:

<?xml version="1.0" encoding="utf-8"?> 
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
    <ListDomainsResult>
        <DomainName>Audio</DomainName>
        <DomainName>Course</DomainName>
        <DomainName>DocumentContents</DomainName>
        <DomainName>LectureSet</DomainName>
        <DomainName>MetaData</DomainName>
        <DomainName>Professors</DomainName>
        <DomainName>Tag</DomainName>
    </ListDomainsResult>
    <ResponseMetadata>
        <RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
        <BoxUsage>0.0000071759</BoxUsage>
    </ResponseMetadata>
</ListDomainsResponse>

我将此XML传递给具有]的解析器>

XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());

并多次调用eventReader.nextEvent();以获取我想要的数据。

这是奇怪的部分-它在本地服务器中很好用。我做出了回应,我感到很高兴。问题是,当我将代码部署到Google App Engine时,传出请求仍然有效,并且响应XML对我来说似乎100%相同且正确,但是响应无法解析,但出现以下异常:

com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?> 
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
    at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
    ... (rest of lines omitted)

我有两倍,三倍,四倍检查此XML是否包含“不可见字符”或非UTF8编码的字符,等等。我在数组中逐字节查看了字节顺序标记或类似性质的东西。没有;它通过了我可能会提出的所有验证测试。更奇怪的是,如果我也使用基于Saxon的解析器,则会发生这种情况-但仅在GAE上,它在我的本地环境中始终可以正常工作。

当我只能在运行良好的环境中运行调试器时(很难找到在GAE上进行远程调试的好方法,这很难跟踪问题的代码。)不过,使用我拥有的原始方法,我已经尝试了一百万种方法,包括:

  • 带有和不带有序言的XML
  • 有无换行符
  • [在序言中有和没有“ encoding =”属性
  • 两种换行样式
  • HTTP流中存在和不存在分块信息
  • 而且我已经尝试了多种组合中的大多数,在这种组合中它们会相互作用-没有任何作用!我机智的尽头。有人以前曾见过这样的问题,希望可以对此有所启发吗?

谢谢!

在过去的48个小时中,我一直对这个绝对令人毛骨悚然的bug感到头疼,所以我想我终于要把毛巾扔掉,尝试在这里问一下,然后再将笔记本电脑扔出窗户。我是...

java xml google-app-engine parsing stax
14个回答
111
投票

您的XML和XSD(或DTD)中的编码不同。XML档案标头:<?xml version='1.0' encoding='utf-8'?>XSD文件头:<?xml version='1.0' encoding='utf-16'?>


0
投票

以下原因是“ org.xml.sax.SAXParseException:序言中不允许内容”的异常。

  1. 首先检查schema.xsd和file.xml的文件路径。

0
投票

就我而言,build.xml文件有问题。只需转到Build > Clean Project即可解决。

本着“只删除

    BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
    test.mark(4);
    while (true) {
        int earlyChar = test.read();
        System.out.println(earlyChar);
        if (earlyChar == 60) {
            test.reset();
            break;
        } else {
            test.mark(4);
        }
    }

FWIW,我所看到的字节为(十进制):239、187、191。


0
投票

本着“只删除

    BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
    test.mark(4);
    while (true) {
        int earlyChar = test.read();
        System.out.println(earlyChar);
        if (earlyChar == 60) {
            test.reset();
            break;
        } else {
            test.mark(4);
        }
    }

0
投票

意外原因:文件路径中的#字符


0
投票

我今天捕获了相同的错误消息。解决方案是将文档从带有BOM的UTF-8更改为不带有BOM的UTF-8


7
投票

此错误消息总是由开头元素中的无效XML内容引起的。例如,XML元素开头的小点“。”。


5
投票

我面临着同样的问题。就我而言,XML文件是从c#程序生成的,并被馈送到AS400中进行进一步处理。经过一番分析后,我确定在生成XML文件时正在使用UTF8编码,而javac(在AS400中)使用的是“无BOM的UTF8”。因此,不得不编写类似于下面提到的额外代码:


4
投票

删除xml声明解决了它


3
投票

虽然在我的utf-8 xml顶级标签为<?xml version="1.0" encoding="utf-8"?>的情况下在notepad ++中检查xml文件并保存该文件时出现问题,但>

通过使用Encoding(Tab)将文件保存在notpad ++中来解决>在UTF-8中进行编码:已选中(在UTF-8-BOM中已进行编码)


2
投票

在我的xml文件中,标题看起来像这样:

<?xml version="1.0" encoding="utf-16"? />

2
投票

我在xml文件中遇到了相同的问题,即“序言中不允许内容”。

解决方案>>

最初,我的根文件夹是'#文件名


0
投票

我有一个制表符而不是空格。替换选项卡'\ t'解决了该问题。

将整个文档剪切并粘贴到记事本++之类的编辑器中,并显示所有字符。

就我的问题而言,解决方案是用等效于HTML的德国umlauts(äöü)代替...

以下原因是“ org.xml.sax.SAXParseException:序言中不允许内容”的异常。

  1. 首先检查schema.xsd和file.xml的文件路径。
  • XML和XSD(或DTD)中的编码应相同。XML档案标头:<?xml version='1.0' encoding='utf-8'?>XSD文件头:<?xml version='1.0' encoding='utf-8'?>
  • 如果XML文档类型声明之前有任何内容,即:hello<?xml version='1.0' encoding='utf-16'?>

  • 0
    投票

    就我的问题而言,解决方案是用等效于HTML的德国umlauts(äöü)代替...

    © www.soinside.com 2019 - 2024. All rights reserved.