我正在尝试更改xml文件中数字的所有实例。应将常数45添加到数字中。
Temp是以下文字:
<rownum value="1">
<backupapplication>HP Data Protector</backupapplication>
<policy>AUTDR12_Daily</policy>
<policytype>FileSystem</policytype>
<dataretained>31</dataretained>
<fullbackup>7</fullbackup>
<backuptime>0.17</backuptime>
<retentionperiod>Short</retentionperiod>
<peakmbps>11</peakmbps>
<backupcategory>Fulls & Fulls</backupcategory>
</rownum>
<rownum value="2">
<backupapplication>HP Data Protector</backupapplication>
<policy>AUTP_Appl_Monthly</policy>
<policytype>FileSystem</policytype>
<dataretained>268</dataretained>
<fullbackup>91</fullbackup>
<backuptime>2.31</backuptime>
<retentionperiod>Long</retentionperiod>
<peakmbps>12</peakmbps>
<backupcategory>Fulls & Fulls</backupcategory>
</rownum>
我尝试了以下代码:
NeedleRegEx = <rownum value="(\d+)">
Replacement = <rownum value="($1+45)">
Temp := RegExReplace(Temp, NeedleRegEx, Replacement)
但这会将其改为
<rownum value="1+45">
虽然我想要
<rownum value="46">
如何在AutoHotKey中执行此操作?
答案 0 :(得分:3)
RegEx不是为评估数学表达式而设计的。有些语言可以使用可以进行动态替换的替换函数(例如JavaScript)。但AHK没有这样的运气
无论如何,使用RegEx来解析XML文档并不是一种好的做法。我建议使用XML解析器。对于AHK,您可以使用MSXML2.DOMDocument
的COM对象。以下是如何使用它的示例(以及进一步的参考资料):http://www.autohotkey.com/board/topic/56987-com-object-reference-autohotkey-v11/page-2#entry367838
您要做的是将XML解析为DOM文档并循环遍历每个rownum
标记。现在,您可以检索value
属性,递增它,并使用新值覆盖该属性。
您在评论中发布的代码:有一些小错误和一个大错误。最大的错误是尝试解析无效的XML。您可以通过将XML文件提供给formatter/validator来检查它们。如果存在解析错误,loadXml()
方法将返回false
。方法obj.saveXML()
不存在。如果要检索文档的字符串表示,只需访问其xml
属性:obj.xml
。如果要将其保存到文件中,则有内置方法save(filepath)
。
这是我对干净方法的建议(是的,你可以使用有意义的变量名!):
doc := ComObjCreate("MSXML2.DOMDocument.6.0")
if(!doc.loadXml(xmlString)) {
msgbox % "Hey! That's no valid XML!"
ExitApp
}
rownums := doc.getElementsByTagName("rownum")
Loop % rownums.length
{
rownum := rownums.item(A_Index-1)
value := rownum.getAttribute("value")
value += 45
rownum.setAttribute("value", value)
}
doc.save("myNewFile.xml")