我正在尝试自动向第三方发布一个简单的 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>
我试过了
- 从 XmlTextWriter 中删除 UTF-8 编码。
- 删除 DocType 中定义的架构引用。
- 尝试使用正则表达式删除开头“<”之前的任何内容。
此时如有任何帮助,我们将不胜感激。
最佳答案
我在其他地方遇到过这个错误,其他人也遇到过,问题通常是开头 < 之前的一个字符,您注意到您已尝试消除该字符。你提到了一个正则表达式,也许你也可以发布它。有许多非打印字符可以找到进入流的方式,尤其是在框架为我们完成工作的情况下。
想一想,下面这行到底做了什么?
writer.WriteStartDocument()
这可能与意外的 MemoryStream 有一些相互作用。可能是你创建的时候在MemoryStream的零位置有东西吧?
我见过的建议修复通常涉及将生成的 XML 放入文件并检查十六进制代码以查看真正导致文件的内容,也许是非打印字符。这在过去对我有帮助,因为它提供了一种识别问题或确认问题存在于其他地方的取证方法。
一些解决方案提倡上传文件而不是流或字符串,但我认为如果您可以识别确切的污染字符序列,则不需要这样做。
关于json - 表单提交错误 : Content is not allowed in prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49109380/