如果使用 NSIS 安装程序在 xml 中为空,则无法更新特定元素的值
Unable to update value of particular element if it is empty in xml using NSIS installer
我正在处理 NSIS [Nullsoft Installer System] 安装程序脚本。例如,当元素为空时,我面临更新 XML 元素值 [used XML 插件] 的问题,
**Element value to be updated: <Name />
After executing the below script, the output is : <Test />**
${xml::LoadFile} "$EXEDIR\install1.config" [=11=]
${If} [=11=] != -1
${xml::GotoPath} "/InstallerInputs/Name" [=11=]
${xml::FirstChild} "" [=11=]
${xml::SetNodeValue} "Test"
${xml::SaveFile} "$EXEDIR\install1.config" [=11=]
${xml::Unload}
${EndIf}
XML结构如下,
<?xml version="1.0" encoding="utf-16" ?>
<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
**<Name></Name>** or **<Name />**
<Password></Password>
</InstallerInputs>
输出XML:
<?xml version="1.0" encoding="utf-16" ?>
<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
**<Test/>**
<Password></Password>
</InstallerInputs>
任何帮助....
两个问题:
- GotoPath 之后您已经在正确的节点,
${xml::FirstChild}
将失败,因为 Name 没有子节点。
${xml::SetNodeValue}
好像是设置标签名,不是里面的文字。
试试这个
!if 0
FileOpen [=10=] "$Temp\test.xml" w
FileWrite [=10=] '<?xml version="1.0" encoding="utf-16" ?>$\r$\n'
FileWrite [=10=] '<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">$\r$\n'
FileWrite [=10=] '<Name></Name>$\r$\n'
FileWrite [=10=] '<Password></Password>$\r$\n'
FileWrite [=10=] '</InstallerInputs>$\r$\n'
FileClose [=10=]
!endif
${xml::LoadFile} "$Temp\test.xml" [=10=]
${If} [=10=] != -1
${xml::GotoPath} "/InstallerInputs/Name" [=10=]
${If} [=10=] = 0
${xml::SetText} "Test" [=10=]
${xml::SaveFile} "$Temp\test.xml" [=10=]
${EndIf}
${xml::Unload}
${EndIf}
我正在处理 NSIS [Nullsoft Installer System] 安装程序脚本。例如,当元素为空时,我面临更新 XML 元素值 [used XML 插件] 的问题,
**Element value to be updated: <Name />
After executing the below script, the output is : <Test />**
${xml::LoadFile} "$EXEDIR\install1.config" [=11=]
${If} [=11=] != -1
${xml::GotoPath} "/InstallerInputs/Name" [=11=]
${xml::FirstChild} "" [=11=]
${xml::SetNodeValue} "Test"
${xml::SaveFile} "$EXEDIR\install1.config" [=11=]
${xml::Unload}
${EndIf}
XML结构如下,
<?xml version="1.0" encoding="utf-16" ?>
<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
**<Name></Name>** or **<Name />**
<Password></Password>
</InstallerInputs>
输出XML:
<?xml version="1.0" encoding="utf-16" ?>
<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
**<Test/>**
<Password></Password>
</InstallerInputs>
任何帮助....
两个问题:
- GotoPath 之后您已经在正确的节点,
${xml::FirstChild}
将失败,因为 Name 没有子节点。 ${xml::SetNodeValue}
好像是设置标签名,不是里面的文字。
试试这个
!if 0
FileOpen [=10=] "$Temp\test.xml" w
FileWrite [=10=] '<?xml version="1.0" encoding="utf-16" ?>$\r$\n'
FileWrite [=10=] '<InstallerInputs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">$\r$\n'
FileWrite [=10=] '<Name></Name>$\r$\n'
FileWrite [=10=] '<Password></Password>$\r$\n'
FileWrite [=10=] '</InstallerInputs>$\r$\n'
FileClose [=10=]
!endif
${xml::LoadFile} "$Temp\test.xml" [=10=]
${If} [=10=] != -1
${xml::GotoPath} "/InstallerInputs/Name" [=10=]
${If} [=10=] = 0
${xml::SetText} "Test" [=10=]
${xml::SaveFile} "$Temp\test.xml" [=10=]
${EndIf}
${xml::Unload}
${EndIf}