我正在尝试将xml发送到第三方通过c#.NET应用程序提供给我的基于java的Web服务,我收到org.xml.sax.SAXParseException: Content is not allowed in prolog
错误。
我已经针对模式验证了xml,并且我传递了用于将xml保存到.xml文件的内存流,然后使用十六进制编辑器打开文件以确保prolog中没有不需要的字符,没有。打开时,文件中的第一个字符是
<?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>
答案 0 :(得分:4)
我能够通过删除UTF编码来解决问题。听起来像在我们的两种情况下,文本实际上不是UTF-8编码。
答案 1 :(得分:3)
您的文件顶部是否有Byte Order Mark导致此混淆?使用十六进制转储或十六进制编辑器转储或编辑文件,并检查前两个或三个字节,并确保文件以
答案 2 :(得分: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解析器认为它在看到{{1}之前看到了评论行。
答案 3 :(得分:0)
只需使用hexplorer等十六进制编辑器打开您的XML文件,然后就可以查看和删除这些奇怪的字符,保存文件并使用首选编辑器打开(我个人使用Notepad++)并确保您的文件使用UTF-8编码: - )
希望这会对你有所帮助
答案 4 :(得分:0)
我对C#/ Java XML互操作性和Java处理字节顺序标记(XML声明之前的2或3个字节以及识别编码字节顺序)没有任何问题。 Java无法很好地使用有效的BOM,因此您必须将其删除。通过派生字节数组并使用:
来检查它arr[0] == (byte) 0xEF && arr[1] == (byte) 0xBB && arr[2] == (byte) 0xBF
这会检查3字节变体,这是造成悲伤的原因: - (
答案 5 :(得分:0)
Web服务是否与其他(Java)客户端一起正常运行? 我收到这个错误很多次了,错误的来源是库依赖的问题 - 如果我没记错的话,JAXB2与Java5有关。