5

我有一个包含多个标签的 XML 文件,我正在尝试使用批处理脚本更改其中一个标签的内容。

xml文件的一个例子是:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>Terminal</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>

我正在尝试将数据更改为我选择的另一个变量<InstallationType></InstallationType>我想我需要某种 For 循环来找到 xml 文件的那一部分,但我不知道如何只编辑那个部分。

4

3 回答 3

13

您确实应该使用专门设计用于操作 XML 的工具。

但是在紧要关头,您可以使用任何可以进行正则表达式搜索和替换的工具来执行一个简单的解决方案,该解决方案可以在您布置的文件中使用,但可能会因具有物理属性的逻辑等效 XML 文件而失败布局重新排列。

我喜欢使用我编写的名为REPL.BAT的混合 JScript/批处理实用程序来通过批处理脚本操作文本文件。该脚本将从 XP 开始在任何本机 Windows 机器上运行,并且不需要安装任何第 3 方可执行文件。单击链接以获取脚本代码和更详尽的描述。

使用 REPL.BAT,一个快速高效但幼稚的解决方案非常简单:

setlocal enableDelayedExpansion
set "newValue=myNewValue"
type "fileName.xml"|repl "(<InstallationType>).*(</InstallationType>)" "$1!newValue!$2" >fileName.xml.new
move /y "fileName.xml.new" "fileName.xml"
于 2013-06-12T04:44:15.197 回答
11
@echo off
setlocal EnableDelayedExpansion

set anotherVariable=New value

(for /F "delims=" %%a in (theFile.xml) do (
   set "line=%%a"
   set "newLine=!line:InstallationType>=!"
   if "!newLine!" neq "!line!" (
      set "newLine=<InstallationType>%anotherVariable%</InstallationType>"
   )
   echo !newLine!
)) > newFile.xml

使用您的示例数据输出:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
于 2013-06-11T22:17:28.113 回答
1

GNU sed

sed "/InstallationType/s/>[^<]*</>New Value</" file.xml

..输出:

<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>New Value</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>
于 2013-06-11T22:26:06.937 回答