POST请求发送XML文档遇Prolog内容不允许错误的解决咨询
解决XML POST请求的SAXParseException错误
问题原因
你遇到的org.xml.sax.SAXParseException; Content is not allowed in prolog错误,核心原因有两个:
- 通过
document.implementation.createDocument创建的XML文档对象,默认不会包含XML声明(<?xml version="1.0" encoding="UTF-8"?>),部分服务器解析器要求必须有这个声明才能正常解析。 - 若直接发送XMLDocument对象而非序列化后的字符串,浏览器可能以不符合预期的格式传递数据,导致解析器在文档开头检测到非法内容。
解决方案
修改jsToXML函数,将XML文档对象序列化为带声明的字符串,而非直接返回文档对象:
export function jsToXML(film, crudOp) { // 创建文档和元素 var xmlDoc = document.implementation.createDocument(null, "film"); var title = xmlDoc.createElement("title"); var year = xmlDoc.createElement("year"); var director = xmlDoc.createElement("director"); var stars = xmlDoc.createElement("stars"); var review = xmlDoc.createElement("review"); // 编辑/删除操作添加ID节点 if (crudOp === "edit" || crudOp === "delete") { var id = xmlDoc.createElement("id"); id.append(film.id); xmlDoc.documentElement.appendChild(id); } // 为节点赋值 title.append(film.title); year.append(film.year); director.append(film.director); stars.append(film.stars); review.append(film.review); // 将节点添加到根元素 xmlDoc.documentElement.appendChild(title); xmlDoc.documentElement.appendChild(year); xmlDoc.documentElement.appendChild(director); xmlDoc.documentElement.appendChild(stars); xmlDoc.documentElement.appendChild(review); // 序列化文档并添加XML声明 const serializer = new XMLSerializer(); // 手动拼接声明,确保编码与请求头一致 const xmlStr = '<?xml version="1.0" encoding="UTF-8"?>' + serializer.serializeToString(xmlDoc); return xmlStr; }
关键注意事项
- 请求头匹配:发送POST请求时,务必设置正确的
Content-Type头,确保编码与XML声明一致:
fetch("/your-api-url", { method: "POST", headers: { "Content-Type": "application/xml; charset=UTF-8", }, body: jsToXML(yourFilmData, "create"), });
- 避免多余字符:确保XML字符串开头没有空格、换行或特殊字符,这些也会触发相同的解析错误。
- 验证XML格式:可将生成的XML字符串复制到在线XML验证工具中检查格式是否合规,排除其他语法问题。
内容的提问来源于stack exchange,提问作者DKWebservices
相关产品推荐
相关产品推荐

