properties.loadfromxml()仅支持java官方dtd定义的xml格式,要求根元素为且键值对必须用...,不支持自定义结构、命名空间或注释,重复key会静默覆盖。

Properties.loadFromXML() 能读取 XML 格式的配置文件,但前提是 XML 结构必须严格符合 Java 官方定义的 DTD(即根元素为 <?xml version="1.0" encoding="UTF-8" standalone="no"?><properties version="1.0"></properties>),否则直接抛 InvalidPropertiesFormatException。
XML 文件结构必须满足 Java 的 properties DTD
Java 不接受任意格式的 XML —— 它只认自己定义的那一套。常见错误是手写或用其他工具生成的 XML 缺少 version="1.0" 属性、用了自定义命名空间、或者把 <entry></entry> 写成 <property></property> 等。
- ✅ 正确开头:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><properties version="1.0"></properties> - ✅ 键值对必须用
<entry key="xxx">yyy</entry>,不能用 CDATA 或子元素嵌套 - ❌ 错误示例:
<config><db.url>...</db.url></config>—— 这不是loadFromXML()能处理的格式
读取时需确保输入流编码与 XML 声明一致
如果 XML 文件声明了 encoding="UTF-8",但你用 FileInputStream 直接传入(默认平台编码),中文值可能乱码;loadFromXML() 本身不解析 BOM,也不自动识别编码。
- 推荐做法:用
Files.newInputStream(path, StandardOpenOption.READ),它尊重文件系统编码,且避免手动指定 Charset 导致不一致 - 避免:
new FileInputStream("a.xml")+props.loadFromXML()→ 在 Windows 上读 UTF-8 文件大概率乱码 - 若必须用
InputStream,确认源头已按声明编码解码(例如用InputStreamReader包装再转回字节流?不行 ——loadFromXML()只接受InputStream,不接受 Reader)
与 load() 并存时注意 key 的覆盖行为
同一个 Properties 实例先后调用 load() 和 loadFromXML(),后加载的会覆盖先加载的同名 key —— 这点和文件顺序无关,只取决于调用时序。
- 如果你在合并多个配置源,建议分开加载到不同实例,再用
putAll()显式控制优先级 -
loadFromXML()不支持注释(不像 .properties 中的#或!),所有<!-- -->会被忽略,但不会报错 - key 中若含空格或特殊字符(如
db.url),XML 中直接写进key="..."即可,无需转义;但值里有、<code>&必须实体化(<、&)
最易被忽略的是:这个方法不校验 key 是否重复,遇到两个相同 key 的 <entry></entry>,后者静默覆盖前者,且不报任何警告。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











