XmlParser
DOM 解析
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.parser.xml.XmlParser |
| 行数 | 119 |
| 实现 | IParser |
结构
XML 的元素名 = value 函数名,属性 at = 对齐位置。
默认配置 assets/ingameinfo/InGameInfo.xml 顶层结构:
<config>
<lines at="topleft">
<line>
<str>Day {day}, {mctime} (</str>
<if>...</if>
<str> time$f)</str>
</line>
</lines>
</config>
load(:26-39)
用 DocumentBuilderFactory 解析成 DOM,存为字段。
⚠️ 未关闭 InputStream(无 try-with-resources),
InGameInfoCore.getInputStream 传入的 FileInputStream 依赖 GC 回收。
⚠️ 未设置 XXE 防护(setFeature 之类)——
本地配置文件场景下影响有限,但属于已知弱点。
parse(:41-59)
遍历根节点的 <lines> 子元素:
- 读
at属性 →Alignment.parse(见 Alignment) getLines(element)取该对齐下的所有<line>- 塞进
format
⚠️ Alignment.parse 对非法值返回 null,
本类需自行判空;未判空会让 format.put(null, ...) 写入空键。
getLines / getValues(:61-101)
| 方法 | 行为 |
|---|---|
getLines(Element) |
取 <line> 子元素,每个交给 getValues |
getValues(Element) |
按文档顺序把每个子元素转成一个 Value |
getElement(Node) |
Node → Element,带 instanceof 检查(:103-109) |
getElement(Node, String) |
同上 + 元素名匹配(:111-118) |
元素名 → Value 实例
Value value = Value.fromString(element.getNodeName());
走 ValueRegistry 的 forName(反射新建)。
未知名不抛异常,返回 ValueSimple.ValueInvalid。
⚠️ 元素名大小写敏感地传给 forName,而 forName 内部 toLowerCase() ——
所以 <STR> 与 <str> 等价。
与 JsonParser 的对称性
JsonParser 是同一格式的 JSON 版,
两者产出的 format 结构必须完全一致。
IPrinter 的 XmlPrinter / JsonPrinter 是对应的反向实现。
相关
- IParser - 接口
- JsonParser - 同一格式的另一实现
- ValueRegistry - 元素名的解析