4

我正在尝试将 xml 发送到第三方通过 ac#.NET 应用程序提供给我的基于 java 的 Web 服务,但org.xml.sax.SAXParseException: Content is not allowed in prolog出现错误。

我已经根据架构验证了 xml,并将用于保存 xml 的内存流传递给 .xml 文件,然后用十六进制编辑器打开文件以确保序言中没有不需要的字符,并且有没有。打开时,文件中的第一个字符是

<?xml version="1.0" encoding="utf-8"?>

我用于将 xml 数据发送到 Web 服务的类接受一个字节数组。我认为使用XmlTextWriter创建 xml到 utf-8 编码的内存流,然后将流的内容发送到字节数组是最直接的方法。

我已经做了很多研究,并尝试了我能找到的围绕这个问题的所有可能性,但没有任何效果。有人可以帮忙吗?提前致谢。

顺便说一句,这是 Web 服务返回给我的部分内容。在 SOAP 消息的有效负载中,应元素看起来像这样,还是像之前的内容一样可读xml?

Messages:
Message:

Payload: <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http:/
/schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema
-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><postSubmissi
on xmlns="http://service.arm.hud.gov/"><submissionHeader><agcHcsId>1</agcHcsId><
agcName>test</agcName><systemName>123</systemName><cmsSubId>123456</cmsSubId><su
bFlag>0</subFlag></submissionHeader><agcType>test</agcType><submissionData>PD94b
WwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48dG5zOlN1Ym1pc3Npb25EYXRhIHhzaTpzY
2hlbWFMb2NhdGlvbj0iaHR0cDovL2dvdi5odWQuYXJtL2FybV9kYXRhYmFnXzNfMS54c2QiIHhtbG5zO
nhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxT......etc............................
</submissionData></postSubmission></soap:Body></soap:Envelope>

这里是 xml 数据以获得更好的可读性:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http:/
    /schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema
    -instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <postSubmissi on xmlns="http://service.arm.hud.gov/">
            <submissionHeader>
                <agcHcsId>1</agcHcsId>
                <agcName>test</agcName>
                <systemName>123</systemName>
                <cmsSubId>123456</cmsSubId>
                <subFlag>0</subFlag>
            </submissionHeader>
            <agcType>test</agcType>
            <submissionData>PD94b
                WwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48dG5zOlN1Ym1pc3Npb25EYXRhIHhzaTpzY
                2hlbWFMb2NhdGlvbj0iaHR0cDovL2dvdi5odWQuYXJtL2FybV9kYXRhYmFnXzNfMS54c2QiIHhtbG5zO
                nhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxT......etc............................
            </submissionData>
        </postSubmission>
    </soap:Body>
</soap:Envelope>
4

6 回答 6

4

我能够通过删除 UTF 编码来解决这个问题。听起来在我们的两种情况下,文本实际上都不是 UTF-8 编码的。

于 2009-05-28T23:13:21.397 回答
3

您的文件顶部是否有导致这种混乱的字节顺序标记?使用十六进制转储或十六进制编辑器转储或编辑文件并检查前两个或三个字节并确保文件以

于 2009-03-16T04:19:58.387 回答
0

我在 C#/Java XML 互操作性和 Java 处理字节顺序标记(XML 声明之前的 2 或 3 个字节并识别编码字节顺序)方面遇到了无穷无尽的问题。Java 不能很好地使用有效的 BOM,因此您必须将其删除。通过派生字节数组并使用以下方法检查它:

arr[0] == (byte) 0xEF && arr[1] == (byte) 0xBB && arr[2] == (byte) 0xBF

这会检查 3 字节的变体,这就是导致悲伤的原因 :-(

于 2009-03-16T10:03:14.163 回答
0

我刚刚收到您的消息,缩进它并验证:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <postSubmission xmlns="http://service.arm.hud.gov/">
            <submissionHeader>
                <agcHcsId>1</agcHcsId>
                <agcName>test</agcName>
                <systemName>123</systemName>
                <cmsSubId>123456</cmsSubId>
                <subFlag>0</subFlag>
            </submissionHeader>
            <agcType>test</agcType>
            <submissionData>
            PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmL *abbreviated data to fit*
            </submissionData>
        </postSubmission>
    </soap:Body>
</soap:Envelope>

我猜想这条消息之前的某些东西不知何故不同步——错误消息似乎表明 XML 解析器认为它在看到该<?xml行之前看到了一条注释。

于 2009-03-16T04:11:31.107 回答
0

只需使用hexplorer 之类的十六进制编辑器打开您的 XML 文件,然后您就可以查看和删除这些奇怪的字符,保存您的文件并使用您喜欢的编辑器(我个人使用Notepad++)打开并确保您的文件使用的是 UTF-8编码:-)

希望对你有帮助

于 2009-03-16T08:47:36.700 回答
0

Web 服务是否与其他 (java) 客户端一起正常运行?我已经多次收到此错误,错误的根源是库依赖问题 - 如果我没记错的话,JAXB2 与 Java5 相关的问题。

于 2009-03-25T09:19:05.177 回答