选择"Single XML Node"检查"Node"是否已经使用PowerSh



首先,我能够通过PowerShell脚本添加过滤器到xml文件,如下所示。

$file = Resolve-Path 'backup.xml'
$output = [xml](Get-Content $file)
$expiresFilterSingleNodeValue = $output.SelectSingleNode("//filter/filter-name[. = 'ExpiresFilter']")
if($expiresFilterSingleNodeValue -ne $null ) {
return
}
$mainNode = $output.DocumentElement
$newNode = [xml]@"
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType font</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
</filter>
"@
$newNode = $output.ImportNode($newNode.DocumentElement, $true)
$mainNode.appendChild($newNode) | out-null
$newNode2 = [xml]@"
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/baseurl/single/node</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
"@
$newNode2 = $output.ImportNode($newNode2.DocumentElement, $true)
$mainNode.appendChild($newNode2) | out-null
$output.Save($file)

另外,文件结构的最新状态如下:

<web-app> 
<filter xmlns="">
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType application/javascript</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType font</param-name>
<param-value>access plus 1 day</param-value>
</init-param>
</filter>
<filter-mapping xmlns="">
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/baseurl/single/node</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
</web-app>

然而,脚本将被触发多次。由于这个原因,Filter也将被添加到文件中,并且将发生问题。

总之,从脚本中可以看到,我添加了一个代码块来检查文件中是否存在过滤器。但它不能正常工作。换句话说,即使添加了Filter,我也不想再次在文件中添加Filter。

$expiresFilterSingleNodeValue = $output.SelectSingleNode("//filter/filter-name[. = 'ExpiresFilter']")
if($expiresFilterSingleNodeValue -ne $null ) {
return
}
你能帮我一下吗?

您的目标<filter>不是您的xpath表达式假设的另一个<filter>的子;它是<filter-mapping>的子节点。

尝试将xpath表达式简化为

//filter-name[. = 'ExpiresFilter']

//web-app//filter-name[. = 'ExpiresFilter']

,看看它是否有效。

最新更新