游戏Mod开发:XML XInclude引用原文件失败及测试方法咨询
XML XInclude测试方案与Mod开发问题解答
一、XInclude测试方法
VSCode本地测试
- 安装
XML Tools插件:- 将Mod XML文件与原版
vanilla.xml放在同一目录,确保路径正确 - 右键点击Mod XML文件,选择
XML Tools > XML Format with XInclude,插件会自动解析并生成合并后的XML,直接验证结构是否符合预期
- 将Mod XML文件与原版
- 命令行测试(Python脚本,无需额外环境):
用以下脚本解析XML并处理XInclude,输出合并结果:import xml.etree.ElementTree as ET from xml.etree.ElementTree import XMLParser # 启用XInclude支持 parser = XMLParser(target=ET.TreeBuilder(insert_comments=True)) parser.parser.UseForeignDTD(True) parser.xinclude() tree = ET.parse('your_mod.xml', parser=parser) root = tree.getroot() ET.dump(root)
在线测试工具
直接使用支持XInclude的在线XML解析器,粘贴原版和Mod的XML内容,指定文件关联后即可查看合并结果。
二、现有XInclude写法的问题分析
- 第一种写法:直接包含整个原版文件,会导致根节点
<filename.xml>嵌套,结构变为<filename.xml><filename.xml>...</filename.xml><nodes>...</nodes></filename.xml>,完全不符合需求 - 第二种写法:
xpointer="element(/1)"指向原版根节点,同样会引发嵌套问题 - 第三种写法:分别包含
<settings>、<grid>、<nodes>后又新增<nodes>,会产生两个<nodes>节点,而非追加内容
正确的追加写法(针对<nodes>内容)
要在原版<nodes>内追加内容,需合并原版节点子元素与新增内容:
<filename.xml xmlns:xi="http://www.w3.org/2001/XInclude"> <!-- 包含原版的settings和grid节点 --> <xi:include href="vanilla.xml" xpointer="element(/1/1)"/> <xi:include href="vanilla.xml" xpointer="element(/1/2)"/> <!-- 合并原版nodes子元素与新增内容 --> <nodes> <xi:include href="vanilla.xml" xpointer="element(/1/3/node())"/> <items_being_added/> </nodes> </filename.xml>
xpointer="element(/1/3/node())"指向原版<nodes>下的所有子节点,实现内容追加。
三、常见疑问解答
不带http的xmlns地址
w3.org/2001/XInclude是否可行?
不可行,XML命名空间必须是完整URI,不带协议的地址不合法,解析器无法识别XInclude标签,必须使用标准的http://www.w3.org/2001/XInclude(部分解析器兼容https开头的地址,但标准为http)游戏客户端不支持XInclude怎么办?
无法强制内置解析器支持,替代方案:- 写预处理脚本:在Mod打包/运行前自动合并原版XML与Mod XML,生成最终文件供游戏读取
- 查看游戏官方Mod机制:部分游戏提供
<append>类标签或Mod加载器支持XML合并
重复
<nodes>标签是替换还是追加?
既不是替换也不是追加,解析器会保留两个<nodes>节点,游戏读取时可能仅识别第一个或报错,无法实现内容追加的需求
内容的提问来源于stack exchange,提问作者KWJ_nekko_6320
相关产品推荐
相关产品推荐

