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 后匹配前后缀,所以能正确还原。
相关
- IPrinter - 接口
- XmlParser - 对应的输入实现
- ValueRegistry -
forClass的实现