如何替换特定元素块中的XML文件中的两个特定元素值?

时间:2017-11-29 11:46:19

标签: windows batch-file cmd

我有这个XML文件:

<?xml version = "1.0" encoding = "UTF-8"?>
<ApplicationsToCheck xmlns = "http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd ../Schemas/HealthCheck/HealthCheckSchema.xsd">
<Application>
<ApplicationName>AccountsPayableAdapter</ApplicationName>
<HAMode>NA</HAMode>
<AppPortList>
<HostPort>
<HostName>ESBBWSVCP01</HostName>
<Port>57611</Port>
</HostPort>
</AppPortList>
</Application>
<Application>
<ApplicationName>CorpCredit</ApplicationName>
<HAMode>LB</HAMode>
<AppPortList>
<HostPort>
<HostName>ESBBWSVCP01</HostName>
<Port>57250</Port>
</HostPort>
<HostPort>
<HostName>ESBBWSVCP02</HostName>
<Port>57250</Port>
</HostPort>
</AppPortList>
</Application>
<Application>
<ApplicationName>CustomerSvcV1_0</ApplicationName>
<HAMode>LB</HAMode>
<AppPortList>
<HostPort>
<HostName>ESBBWSVCP01</HostName>
<Port>57632</Port>
</HostPort>
<HostPort>
<HostName>ESBBWSVCP01</HostName>
<Port>57641</Port>
</HostPort>
<HostPort>
<HostName>ESBBWSVCP02</HostName>
<Port>57632</Port>
</HostPort>
<HostPort>
<HostName>ESBBWSVCP02</HostName>
<Port>57641</Port>
</HostPort>
</AppPortList>
</Application>
</ApplicationsToCheck>

我想使用Windows脚本更改两个 HostName 元素的值,使其最终为ESBBWSVCP03而不是ESBBWSVCP01而不是ESBBWSVCP04,而不是{{} 1}}在文件中,但在元素 ApplicationName 中,值为ESBBWSVCP02

编辑:以下是我的尝试:

CorpCredit

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

执行批处理文件的Windows命令解释程序不是为处理XML文件而设计的。有脚本解释器,具有用于XML文件编辑/修改的内置功能。<​​/ p>

顺便说一下:XML文件的前两行应该是:

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationsToCheck xmlns="http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tibco.com/schemas/StoreAppraisalSvc/SharedResources/Schemas/HealthCheck/Schema.xsd ../Schemas/HealthCheck/HealthCheckSchema.xsd">

属性名称,等号和属性值之间不应有空格。

但是,使用 Dave Benham 编写的JREPL.BAT可以轻松完成此任务,这是一个批处理文件/ JScript混合,用于使用正则表达式替换文件中的字符串。

可以使用以下批处理文件更新文件D:\CorpApplicationsToCheck.xmljrepl.bat与此批处理文件位于同一目录中。

@echo off
call "%~dp0jrepl.bat" "(<ApplicationName>CorpCredit</ApplicationName>(?:[\s\S](?!<HostName>))+?[\s\S]<HostName>ESBBWSVCP0)1(</HostName>(?:[\s\S](?!<HostName>))+?[\s\S]<HostName>ESBBWSVCP0)2" "$13$24" /M /F D:\CorpApplicationsToCheck.xml /O -

正则表达式搜索字符串的说明:

( ... ) ...标记/捕获组。第一个括号对之间的表达式找到的字符串在替换字符串中用$1反向引用,以将找到的字符串的这一部分保留在文件中而不进行修改。搜索字符串包含第二个括号对,用于捕获找到的字符串的第二部分,以便在替换字符串中以$2引用的替换时保持未修改。

<ApplicationName>CorpCredit</ApplicationName> ...在批处理文件中找到区分大小写的字符串。

(?:[\s\S](?!<HostName>))+?[\s\S] ...找到任何空白字符或任何非空白字符,这意味着包含换行符的任何字符都是非贪婪的一次或多次,直到下一个出现的标记{ {1}}。 <HostName> ... (?:定义了一个非标记组,用于指定一个表达式,乘法器)应该在乘法器之后用+定义非贪心。 ? ... (?!是一个负面的预测。此表达式用于匹配在下一个之前指定的固定字符串之后的所有内容,而不是任何开始标记)

<HostName> ...此字符串应在此处写下。

<HostName>ESBBWSVCP0 ..下一个字符必须是此标记组之外的字符,因为目标是将其替换为1

然后第二个具有几乎相同表达的标记组跟在标记组外的3后面,用2替换。

因此表达式搜索块:

4

如果可以使用带有选项<ApplicationName>CorpCredit</ApplicationName> <HAMode>LB</HAMode> <AppPortList> <HostPort> <HostName>ESBBWSVCP01</HostName> <Port>57250</Port> </HostPort> <HostPort> <HostName>ESBBWSVCP02 (多行)的jrepl.bat找到这个多行字符串(块),则它将替换为块:

/M

此搜索会忽略文件中的所有其他<ApplicationName>CorpCredit</ApplicationName> <HAMode>LB</HAMode> <AppPortList> <HostPort> <HostName>ESBBWSVCP03</HostName> <Port>57250</Port> </HostPort> <HostPort> <HostName>ESBBWSVCP04 <HostName>ESBBWSVCP01</HostName>并替换。