我正在尝试将一个简单的XML文档自动发布到第三方,内容是一个URL编码的XML文档,目前正在使用以下代码创建提交:
Using client As New WebClient
Dim reqParm As New NameValueCollection
reqParm.Add("cxml-urlencoded", sXmlOrderMessage)
Dim respBytes = client.UploadValues(cXMLSettings.SupplierSetupUrl, "POST", reqParm)
Dim respBody = (New UTF8Encoding(False).GetString(respBytes))
End Using
这确实有效,并提交所需的内容。 XML是使用XmlTextWriter组件构建的,文档的标题是这样的:
Dim mem As New MemoryStream
Dim writer As New XmlTextWriter(mem, Encoding.UTF8)
writer.WriteStartDocument()
writer.WriteDocType("cXML", Nothing, "http://xml.cXML.org/schemas/cXML/1.1.009/cXML.dtd", Nothing)
writer.WriteStartElement("cXML")
writer.WriteAttributeString("payloadID", objCXMLDetails.PayloadID + Request.Url.Host)
writer.WriteAttributeString("xml:lang", "en-gb")
writer.WriteAttributeString("timestamp", DateTime.Now.ToString("o"))
生成XML后,我会使用以下内容将其转换为字符串:
writer.WriteEndDocument()
writer.Flush()
Dim reader As New StreamReader(mem)
mem.Seek(0, SeekOrigin.Begin)
Return reader.ReadToEnd
这将返回一个字符串,然后我可以对其进行URL编码。
XML返回(我只显示标题),是:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.1.009/cXML.dtd">
<cXML payloadID="20180305112030.15272.382530855@localhost" xml:lang="en-gb" timestamp="2018-03-05T11:20:30.9962738+00:00">
问题是提交时,我收到以下错误:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cXML.org/schemas/cXML/1.2.017/cXML.dtd"> -
<cXML timestamp="2018-03-05T08:46:58" payloadID="87f75924-9851-47c5-bd6d-76c723657476">
-
<Response>
<Status text="Not Acceptable org.jdom.input.JDOMParseException: Error on line 1: Content is not allowed in prolog." code="406" />
</Response>
</cXML>
我试过
在这一点上的任何帮助将不胜感激。
答案 0 :(得分:0)
我在其他地方遇到过这个错误,就像其他人一样,问题通常是在打开&lt;之前的一个字符,你注意到你已经试图消除它。你提到了一个正则表达式,也许你也可以发布它。有许多非打印字符可以进入流中,特别是在框架为我们工作的情况下。
考虑一下,下一行究竟做了什么?
writer.WriteStartDocument()
可能存在一些与此相关的问题以及意外的MemoryStream。也许在你创建它时,MemoryStream的零位有什么东西?
我见过的建议修复通常涉及将生成的XML放到文件中并检查十六进制代码以查看真正引导文件的内容,可能是非打印字符。这是过去帮助我的原因,因为它提供了一种法医方法来识别问题或确认问题存在于其他地方。
有些解决方案主张上传文件而不是流或字符串,但如果您能识别出确切的污染字符序列,我认为不需要这样做。