使用批处理脚本替换xml文件中的字符串

时间:2016-12-01 23:28:34

标签: web-services powershell batch-file jboss

我是批处理脚本的新手。我想替换特定文件中的字符串。 在下面的脚本中,我收到了错误。

@echo off
$standalone = Get-Content 'C:\wildfly\standalone\configuration\standalone.xml'

$standalone -replace '<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>','<wsdl-host>${jboss.bind.address:0.0.0.0}</wsdl-host>' | 
Set-Content 'C:\wildfly\standalone\configuration\standalone.xml' 

1 个答案:

答案 0 :(得分:1)

编辑XML的正确方法是将其作为XML文档处理,而不是作为字符串处理。这是因为XML文件无法保证保持特定的格式。任何编辑都应该是上下文感知的,并且字符串替换不是。考虑三个eqvivalent XML片段:

<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>

<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host >

<wsdl-host >${jboss.bind.address:127.0.0.1}</wsdl-host >

请注意,元素名称中的whitespacing不同,it's legal添加一些。更重要的是,在实践中,许多实现只是丢弃元素值中的换行符,因此以下两个可能会为配置解析器提供相同的结果:

<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>

<wsdl-host>${jboss.bind.address:127.0.0.1}
</wsdl-host>

将XML作为字符串处理真的没有多大意义,是吗?

幸运的是,Powershell内置了对XML文件的支持。一个简单的方法就是这样,

# Mock XML config
[xml]$x = @'
<root>
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
</root>
'@

# Let's change the wsdl-host element's contents
$x.root.'wsdl-host' = '${jboss.bind.address:0.0.0.0}'

# Save the modified document to console to see the change
$x.save([console]::out)

<?xml version="1.0" encoding="ibm850"?>
<root>
  <wsdl-host>${jboss.bind.address:0.0.0.0}</wsdl-host>
</root>

如果您无法使用Powershell并且无法使用批处理脚本,那么您确实需要使用第三方XML操作程序。