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> 子元素:

  1. 读 at 属性 → Alignment.parse(见 Alignment)
  2. getLines(element) 取该对齐下的所有 <line>
  3. 塞进 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 是对应的反向实现。

相关