AutoHotkey作为一款强大的Windows自动化脚本工具,原生并不直接提供XML文件的读写接口,但可以通过调用系统自带的MSXML COM组件来实现XML文件的解析和编辑操作,这种方式兼容性高且功能完整。

一、AutoHotkey读取XML文件
读取XML文件的核心是创建MSXML2.DOMDocument对象,加载XML内容后通过节点路径获取对应数据,具体步骤如下:
1. 基础读取示例
假设我们有一个名为config.xml的配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<app_name>自动化工具</app_name>
<version>1.0.0</version>
<setting>
<auto_start>true</auto_start>
<log_path>D:logs</log_path>
</setting>
</config>
使用AutoHotkey读取该文件内容的代码如下:
; 创建XML DOM对象
xmlDoc := ComObjCreate("MSXML2.DOMDocument.6.0")
; 设置异步加载为false,确保加载完成后再执行后续操作
xmlDoc.async := false
; 加载XML文件,注意路径需要是绝对路径或者相对于脚本的路径
xmlFile := A_ScriptDir "config.xml"
if (!xmlDoc.load(xmlFile)) {
MsgBox, 加载XML文件失败,错误描述:% xmlDoc.parseError.reason
return
}
; 读取根节点下的app_name节点内容
appName := xmlDoc.selectSingleNode("/config/app_name").text
; 读取setting节点下的auto_start内容
autoStart := xmlDoc.selectSingleNode("/config/setting/auto_start").text
; 读取version节点内容
version := xmlDoc.selectSingleNode("/config/version").text
MsgBox, 应用名称:%appName%`n版本号:%version%`n自启动状态:%autoStart%
2. 遍历XML节点
如果XML中存在多个同层级节点,可以使用selectNodes方法获取节点集合后遍历:
; 假设XML中有多个user节点
xmlContent := "
(<?xml version='1.0' encoding='UTF-8'?>
<users>
<user id='1'>张三</user>
<user id='2'>李四</user>
<user id='3'>王五</user>
</users>)"
xmlDoc := ComObjCreate("MSXML2.DOMDocument.6.0")
xmlDoc.async := false
xmlDoc.loadXML(xmlContent)
; 获取所有user节点
userNodes := xmlDoc.selectNodes("/users/user")
; 遍历节点集合
Loop, % userNodes.length {
currNode := userNodes.item(A_Index-1)
userId := currNode.getAttribute("id")
userName := currNode.text
MsgBox, 用户ID:%userId%`n用户名:%userName%
}
二、AutoHotkey写入XML文件
写入XML文件分为两种场景,一种是创建全新的XML文件,另一种是在已有XML文件基础上修改内容后保存。
1. 创建新的XML文件
通过DOM对象创建节点、设置节点内容和属性,最后调用save方法保存文件:
; 创建XML DOM对象
xmlDoc := ComObjCreate("MSXML2.DOMDocument.6.0")
; 创建声明节点
xmlDecl := xmlDoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
xmlDoc.appendChild(xmlDecl)
; 创建根节点
rootNode := xmlDoc.createElement("employees")
xmlDoc.appendChild(rootNode)
; 创建第一个员工节点
emp1 := xmlDoc.createElement("employee")
emp1.setAttribute("id", "1001")
; 创建姓名子节点
name1 := xmlDoc.createElement("name")
name1.text := "赵六"
emp1.appendChild(name1)
; 创建部门子节点
dept1 := xmlDoc.createElement("department")
dept1.text := "技术部"
emp1.appendChild(dept1)
rootNode.appendChild(emp1)
; 创建第二个员工节点
emp2 := xmlDoc.createElement("employee")
emp2.setAttribute("id", "1002")
name2 := xmlDoc.createElement("name")
name2.text := "孙七"
emp2.appendChild(name2)
dept2 := xmlDoc.createElement("department")
dept2.text := "产品部"
emp2.appendChild(dept2)
rootNode.appendChild(emp2)
; 保存文件到脚本目录
savePath := A_ScriptDir "employees.xml"
xmlDoc.save(savePath)
MsgBox, XML文件已保存至:%savePath%
2. 修改已有XML文件并保存
先加载已有XML文件,修改对应节点的内容或属性,再重新保存即可:
; 加载之前创建的config.xml
xmlDoc := ComObjCreate("MSXML2.DOMDocument.6.0")
xmlDoc.async := false
xmlFile := A_ScriptDir "config.xml"
if (!xmlDoc.load(xmlFile)) {
MsgBox, 加载文件失败
return
}
; 修改version节点内容
versionNode := xmlDoc.selectSingleNode("/config/version")
versionNode.text := "1.0.1"
; 修改setting下的log_path内容
logPathNode := xmlDoc.selectSingleNode("/config/setting/log_path")
logPathNode.text := "D:new_logs"
; 新增一个节点
newNode := xmlDoc.createElement("update_time")
newNode.text := "2024-05-20"
xmlDoc.selectSingleNode("/config").appendChild(newNode)
; 保存修改,直接覆盖原文件
xmlDoc.save(xmlFile)
MsgBox, XML文件修改并保存完成
三、注意事项
- 加载XML文件时如果使用
load方法,路径中的反斜杠不需要额外转义,AutoHotkey会自动处理。 - 如果XML文件包含中文,建议编码设置为UTF-8,避免出现乱码问题。
- 操作节点前最好先判断节点是否存在,避免调用
text属性时出现空对象错误。 - MSXML2.DOMDocument的版本可以选择6.0,兼容性更好,支持更多XML规范。
XML节点的路径语法和XPath基本一致,熟悉XPath的开发者可以快速上手节点定位操作。
AutoHotkeyXML读写XML解析脚本编程修改时间:2026-06-10 23:39:47