使用Windows批处理文件更改XML文件中的标签数据

5
我有一个XML文件,其中包含多个标签,我正在尝试使用批处理脚本更改其中一个标签的内容。
XML文件的示例为:
<ConfigurationData>
<ReportsFolder>\Reports</ReportsFolder>
<Helpfolder>\Help</HelpFolder>
<InstallationType>Terminal</InstallationType>
<LicenseFolder>..\License</LicenseFolder>
</ConfigurationData>

我正在尝试更改<InstallationType></InstallationType>之间的数据为我选择的另一个变量。我认为需要使用某种For循环来查找xml文件的该部分,但我不知道如何仅编辑该部分。

请查看这里的解决方案:https://dev59.com/tXVD5IYBdhLWcg3wL4cA 的副本。 - Yuriy Galanter
http://www.dostips.com/DtTipsStringManipulation.php - Ken White
不完全是。那个问题中的所有答案都是更多的“蛮力”查找和替换特定字符串的所有实例。在我的问题中,我只想更改两个 XML 标记之间的数据,并且我并不一定知道最初会有什么数据。 - user2382144
你没有可以正确操作XML的工具吗?比如编程语言,甚至VBSCRIPT? - John Saunders
3个回答

13

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

但在紧急情况下,您可以使用任何能够进行正则表达式搜索和替换的工具来执行一个朴素的解决方案,该方案可以处理您所拥有的文件布局,但可能无法处理逻辑上等效但物理布局已被重新排列的XML文件。

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

使用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"

4
我提醒 OP 应使用 XML 意识工具,正则表达式“解决方案”可能无法处理有效的重新排列的 XML 文件输入。您仍然认为答案应该被评为-1,因为它清楚地说明了如何使用正则表达式来操作OP的布局吗?即使明确指出如果输入的XML物理布局更改,则其可靠性将无法保证?这似乎是严厉和任意的,特别是考虑到 Aacini 的回答比正则表达式“解决方案”更加缺乏 XML 意识性,但他的回答却没有受到您的责备。至少你在评论中解释了你的原因,感谢你的礼貌。 - dbenham
2
@JohnSaunders:我查看了您的个人资料,发现您在Batch-file标签主题上只发布了一个回答,而且是对Batch解决方案的负面回答。我恳请您礼貌地保持您的回答和评论在您的专业领域内,而这显然不是Batch文件...非常感谢。 - Aacini

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>

嗯,这肯定接近了。它会出现错误,指示该进程无法访问文件,因为它正在被另一个进程使用,并且该文件被清空。然而,我以其他方式编辑文件没有任何问题。 - user2382144
那个错误与批处理代码无关。也许你同时在编辑器或其他程序中打开了输入或输出的 .xml 文件,而批处理文件正在运行? - Aacini
那是我检查的第一件事。我还尝试在一个之前未打开过的单独的xml文件上运行它,但是我收到了相同的错误。 - user2382144
在运行批处理文件之前执行此行:type theFile.xml > newFile.xml;仔细检查批处理文件中使用的名称与文件的实际名称是否匹配。如果这不起作用,请关闭 MS-DOS 命令窗口并重新打开它... - Aacini

1

GNU 替换文本工具

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

..输出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接