XmlPrinter

写回 XML

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.printer.xml.XmlPrinter
行数 94
实现 IPrinter

print(:26-52)

用 DocumentBuilderFactory 新建空 Document, 调 appendLines 填充,最后 Transformer 写到 File。

⚠️ 没有 TransformerException 的处理说明 —— print 声明返回 boolean,异常路径必须 catch 并返回 false。

⚠️ 写文件未做原子替换(先写临时文件再 rename), 写到一半失败会留下截断的配置文件。 玩家随后用 /igi load 加载该文件即失败。

三个 append 方法

方法 行 作用
appendLines(Document, Element, format) :54-68 遍历 format 的 9 个对齐,各建一个 <lines at="...">
appendLine(Document, Element, lines) :70-80 一行 → 一个 <line>
appendValues(Document, Element, values) :82-92 该行的所有 value → 顺序子元素

⚠️ appendLines 遍历 format 这个 Map —— Alignment 的 getX / getY 用 switch 表达式且枚举有 VALUES 数组,但 Map<Alignment, ...> 若是 HashMap(InGameInfoCore 的 :50 确实是 new HashMap<>()),遍历顺序不保证与枚举声明序一致。

所以 /igi save 生成的 XML 里,9 个 <lines> 块的顺序可能每次不同。 这不影响解析(XmlParser 按 at 属性识别), 但会让 diff 变得嘈杂。

Value → 元素名

元素名取 Value.toString(value) → ValueRegistry 的 forClass (即 Value 的 getType,:40-42)。

⚠️ forClass 是精确类匹配, 所以输出的是主名而非别名,且未注册的类回落到字面量 "invalid"。

⚠️ 与 XmlParser 相反: 解析时元素名 → forName(反射新建), 输出时实例 → forClass(查表)。 两条路径的映射不是双射 —— 若某 value 类未被注册,forClass 返回 "invalid", 该 forName("invalid") 得到的却是 ValueInvalid 而非原类。 即未注册的 value 类无法往返。

at 属性

由 Alignment 的 toString() 给出枚举名 (TOPLEFT 等)。XmlParser 的 Alignment.parse 会 toLowerCase 后匹配前后缀,所以能正确还原。

相关