我有这个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
非常感谢任何帮助。
答案 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.xml
,jrepl.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>
并替换。