invalidformatexception 根本原因是 xml 不符合 java properties 的严格 schema:根节点必须为 ,且至少含一个 或 ,禁止命名空间、doctype 等;loadfromxml() 支持 utf-8 中文但结构刚性,性能较差且不支持嵌套。

Properties.loadFromXML 读取 XML 配置时抛出 InvalidFormatException
根本原因是 XML 格式不满足 Java 内置的 Properties XML 规范——它不是任意 XML,而是有严格 schema 的固定结构。
常见错误现象:java.util.InvalidFormatException: Invalid XML document. Root element must be <properties>, and root element must contain one <comment> or <entry> subelement</entry></comment></properties>
- 根节点必须是
<properties></properties>(大小写敏感),不能是<config></config>或<root></root> - 必须包含至少一个
<entry key="xxx">yyy</entry>或一个<comment>xxx</comment></li> <li>不允许出现命名空间、DOCTYPE、处理指令(如 <code><?xml version="1.0"?>
可以有,但不能带standalone="no"等额外属性) - 注释节点
<comment></comment>必须在所有<entry></entry>之前,且最多只能有一个
正确示例(可直接用 loadFromXML 加载):
<?xml version="1.0" encoding="UTF-8"?> <properties> <comment>Generated by Java</comment> <entry key="db.url">jdbc:h2:mem:test</entry> <entry key="db.user">sa</entry> </properties>
为什么不用 load() 而选 loadFromXML()
核心区别不在“是否支持中文”,而在于编码与结构容错性:XML 默认按 UTF-8 解析,天然规避 load() 的 ISO-8859-1 乱码陷阱;但代价是牺牲灵活性。
立即学习“Java免费学习笔记(深入)”;
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
-
load()读取 .properties 文件:简单、兼容老配置,但值中含中文需 Unicode 转义(如name=\u4f60\u597d),否则乱码 -
loadFromXML()读取 .xml 文件:值可直接写明文中文,无需转义,但要求 XML 结构合规,且不支持带空格的 key(<entry key="cache size">1024</entry>会解析失败) - 性能上,
loadFromXML()比load()慢约 2–3 倍(DOM 解析开销),小配置无感,高频加载场景需留意
loadFromXML() 不支持嵌套或列表,别硬塞复杂结构
Java 的 Properties 是纯键值对容器,XML 只是换种格式存扁平数据——它不解析子元素、不递归、不识别数组语法。
错误尝试:
<entry key="redis.nodes"> <host>127.0.0.1</host> <port>6379</port> </entry>
结果:loadFromXML() 把整个 XML 片段当字符串值读入,getProperty("redis.nodes") 返回的是带标签的原始文本,不是对象。
- 若需结构化配置,应换用
JAXB、Jackson(XML module)或SnakeYAML等专用库 - 若坚持用
Properties,可用点号分隔模拟层级,如redis.host=127.0.0.1、redis.port=6379,再手动组装 - 列表类需求只能靠约定,例如
task.keys=key1,key2,key3,再用String.split(",")拆分
保存 XML 时别漏掉 storeToXML() 的必需参数
storeToXML() 第二个参数是注释(String comment),传 null 会导致生成的 XML 缺少 <comment></comment> 节点,下次用 loadFromXML() 就会报错。
- 正确调用:
props.storeToXML(outputStream, "Auto-generated config", "UTF-8") - 错误写法:
props.storeToXML(outputStream, null)→ 输出无<comment></comment>,加载失败 - 第三个参数(encoding)建议显式指定
"UTF-8",避免平台默认编码差异(如 Windows 上可能用 GBK) - 生成的 XML 中
<entry></entry>值里的特殊字符(、<code>&)会被自动转义,无需手动处理
XML 格式校验比 properties 文件严格得多,一个空格、多一行注释、少一个闭合标签,都可能让 loadFromXML() 直接崩溃。真要图省事,不如老实用 .properties + native2ascii;非要 XML,就老老实实按它的规矩来。









