org.xml.sax.SAXParseException: Content is not allowed in prolog

本文讨论了在使用DOM4J读取UTF-8编码的XML文件时遇到的BOM问题,解释了BOM(Byte Order Mark)在UTF编码中的作用,并提供了区分UTF-8文件是否带有BOM的方法。最终通过在UE中打开并另存为“utf-8无bom”解决了问题。

最近在使用 dom4j 读取一个xml 文件,xml 文件为 utf-8 读取格式 也为utf-8;不知道为什么,死活读取不了,就是要报:

org.xml.sax.SAXParseException: Content is not allowed in prolog 这个错误,搞到我很郁闷!

后来上网搜索一看,原来这里的水也不浅。

 

BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测,而把它当作正常字符处理。

微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

 

到这里,真相大白,可恶的微软,把utf-8 格式的文件在前边加了 EF BB BF三个字节 ,而dom4j 不认这些!我们使用ue 打开xml 文件,另存为"utf-8 无bom" 大功告成。

 

 

在Spring框架中,使用XML配置文件定义Bean时,若某个`<property>`元素缺少了`ref`属性的声明,会导致`BeanDefinitionStoreException`异常。该异常表明XML文档的结构不符合Spring定义的Schema规范,具体错误信息通常会指出哪一行、哪个元素存在问题[^1]。 `<property>`元素在Spring XML配置中用于为Bean的属性注入值或引用其他Bean。如果属性值是另一个Bean的引用,则必须使用`ref`属性来指定目标Bean的名称。例如: ```xml <bean id="exampleBean" class="com.example.ExampleBean"> <property name="dependencyBean" ref="anotherBean"/> </bean> ``` 若缺少`ref`属性,而直接写入目标Bean的名称,如: ```xml <property name="dependencyBean" value="anotherBean"/> ``` 则Spring会将`anotherBean`视为字符串值注入,而不是引用。如果目标属性期望的是一个对象引用,这将导致类型不匹配,进而引发`BeanCreationException`或其他运行时异常。然而,在某些情况下,如XML解析阶段Spring检测到结构错误,也可能直接抛出`BeanDefinitionStoreException`,提示`ref`属性缺失。 ### 解决方法 1. **检查XML配置文件的结构** 确保所有引用其他Bean的`<property>`元素都正确使用了`ref`属性,而不是`value`属性。例如: ```xml <property name="dependencyBean" ref="anotherBean"/> ``` 2. **验证XML文件的Schema声明** Spring XML配置文件通常需要在文件头声明正确的XSD Schema,确保XML解析器能够正确校验文档结构。例如: ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ``` 如果Schema声明不正确或版本不兼容,可能导致解析器无法识别某些元素或属性,从而引发异常。 3. **清理和重建项目** 有时,IDE(如Eclipse)可能缓存了旧的编译结果,导致即使XML文件已修正,异常仍然存在。可以尝试清理项目并重新构建,以确保最新的配置文件被加载。 4. **检查依赖版本** Spring框架的不同版本对XML配置的支持可能存在差异。确保使用的Spring版本与XML配置文件中引用的Schema版本一致,避免因版本不匹配导致解析错误。 5. **查看完整的异常堆栈信息** `BeanDefinitionStoreException`通常是封装了底层解析错误(如`SAXParseException`)的异常。查看完整的堆栈信息有助于定位具体的XML解析问题。 ```java Caused by: org.xml.sax.SAXParseException: Attribute 'ref' must be declared for element type 'property'. ``` 上述信息明确指出`<property>`元素缺少了`ref`属性,应据此修正配置文件。 ### 总结 `BeanDefinitionStoreException`通常源于Spring XML配置文件的结构不符合Schema规范。针对`<property>`元素缺少`ref`属性的情况,应确保所有引用其他Bean的属性都使用`ref`而非`value`。此外,检查XML文件的Schema声明、清理项目、验证Spring版本以及查看完整的异常堆栈信息,都是排查此类问题的重要步骤。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值