DOM解析XML报错:Content is not allowed in prolog

本文详细介绍了XML解析过程中遇到BOM头导致的问题,并提供了有效的解决方法,包括如何使用UltraEdit或EmEditor打开并保存XML文件以去除BOM头,以及如何正确处理从远程请求回来的含有BOM头的内容。此外,还探讨了DOM4J版本过低可能导致的问题,并建议使用最新稳定版本进行开发。

报错内容为:

Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.

 

网上所述总结来说就是解析内容内包含BOM。这个标记是看不到的,流里面有这个标记而已。
BOM:Byte Order Mark,中文名字节顺序标记。UCS规范建议在传输字节流前,先传输BOM来判断字节顺序。
其实UTF-8是不需要用BOM来表明字节顺序的,但是可以 用BOM来表明编码方式。BOM的UTF-8编码是EF BB BF,所以呢,如果接受者收到EF BB BF开头的字节流,就说明它是UTF-8编码了。

 

解决办法:

如果解析的是文件

可以用UltraEdit或者EmEditor打开XML,然后另存为,保存的时候有选项是以无BOM的UTF-8保存还是以有BOM的UTF-8保存。

 

如果是从远程请求回来的内容:

那么你把返回的流New为字符串,是看不到BOM的,但是你必须截取你需要的内容:

if(null != result && !"".equals(result)){
	if(result.indexOf("<") != -1 && result.lastIndexOf(">") != -1 && result.lastIndexOf(">") > result.indexOf("<"))
		result = result.substring(result.indexOf("<"), result.lastIndexOf(">") + 1);
}

 

也有说是DOM4J版本较低引起的,但是我看了一下我是用的版本是1.6.1,所以排除此类可能,但是在实际中我还是建议使用最新稳定版本来进行开发。 

 

更新
今天看日志,发现我的异常不是因为BOM头引起的,幸好我也打印了收到的内容,我一看,我去,服务器在自己处理失败以后直接返回个 error字符串,mian了一下,果然出错,这坑爹的玩儿。
public static void main(String[] args) throws DocumentException {
	String str = "error";
	Document doc = DocumentHelper.parseText(str);
	System.out.println(doc.asXML());
}
 

请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/ 

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

这个是BeanShell Sampler 的代码import java.net.*; import java.io.*; try { // 创建TCP连接 Socket socket = new Socket("10.192.32.178", 9810); socket.setSoTimeout(5000); // 发送请求 OutputStream out = socket.getOutputStream(); String request = "000947QPC QP2001 <?xml version=\"1.0\" encoding=\"GBK\"?><root><head><transeq>20250626000003s1120110230</transeq><servtp>CMS</servtp><prcscd>QP2001</prcscd><pwdmod></pwdmod><accflg></accflg><router>66</router><termno></termno><cityno></cityno><brchno>0000000</brchno><userid>zxcx002</userid></head><body><req><tranCode>QP2001</tranCode><busiChannel>000000</busiChannel><transq>20211126000003s1120110230</transq><rptType>A</rptType></req></body></root>"; out.write(request.getBytes("GBK")); out.flush(); // 接收响应 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = ""; String line; while ((line = in.readLine()) != null) { response += line + "\n"; } response= response.replace("000550QPC QP2001 ", ""); // 将响应保存到JMeter变量中 vars.put("tcpResponse", response); // 关闭连接 in.close(); out.close(); socket.close(); // 设置取样器成功 SampleResult.setSuccessful(true); SampleResult.setResponseData(response, "GBK"); } catch (Exception e) { SampleResult.setSuccessful(false); SampleResult.setResponseMessage(e.toString()); } 以下是 BeanShell PostProcessor的代码 import javax.xml.parsers.*; import org.w3c.dom.*; import javax.xml.xpath.*; String response = prev.getResponseDataAsString(); try { // 创建Document对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new java.io.ByteArrayInputStream(response.getBytes())); // 创建XPath对象 XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); // 提取参数(示例:提取<sessionId>标签的值) String url = xpath.evaluate("/root/body/resp/rptURL", doc); String rptTocken = xpath.evaluate("/root/body/resp/rptTocken", doc); String rptURL = url.substring(7, 20); String port = url.substring(21, 25); String local = url.substring(26); // 保存参数 log.info("rptURL:"+rptURL); log.info("port:"+port); log.info("local:"+local); log.info("rptTocken:"+rptTocken); vars.put("rptURL", rptURL); vars.put("port", port); vars.put("local", local); vars.put("rptTocken", rptTocken); } catch (Exception e) { log.error("解析XML失败: " + e.getMessage()); } http请求配置如图 非gui运行代码后出现 ERROR - jmeter.util.BeanShellTestElement: 解析XML失败: Content is not allowed in prolog. 2025/07/09 13:40:28 ERROR - jmeter.util.BeanShellTestElement: 解析XML失败: Content is not allowed in prolog. 2025/07/09 13:40:28 ERROR - jmeter.util.BeanShellTestElement: 解析XML失败: Content is not allowed in prolog. 服务器是linux jmeter安装在window 解决办法 怎么操作
07-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值