2016-08-23 25 views
1

在驗證XML文件中的id時,它充當區分大小寫。我添加了「翻譯」以使其不區分大小寫。以下是我的代碼:XML SelectSingleNode區分大小寫

$Config = "xmlfile" 
[xml]$configxml = Get-Content $config 
$siteId = "Test" 
$Siteid = $Siteid.ToLower() 

$siteinfo = $configxml.SelectSingleNode("/configuration/environment[translate(@id='$($siteId)'])"); 

if(!$siteinfo) 
{ 
    Write-Host "id specified '$siteId' not found in '$config' Aborting..." 
    exit -1 
} 
else 
{ 
    Write-Host "site id is present" 
} 

我收到以下錯誤:

id specified 'Test' not found in 'xmlfile' Aborting... 

這裏是我的xml文件:

<configuration> 

    <!--       TEST         --> 
    <environment id="TEST"> 
     <client>ABC</client> 
     <type>Test</type> 
     <filetype>ALL</filetype> 
     <enable>yes</enable> 
    </environment> 

</configuration> 

可有人請我提出可能的解決方案如何使它作爲區分大小寫以及如何使用「翻譯」?

回答

1

代替XPATH的,你也可以選擇節點類似性質:

$config = "xmlfile" 
[xml]$configxml = Get-Content $config 
$siteId = "Test" 

$siteInfo = $configxml.configuration.environment | Where id -eq $siteId 

這也將不區分大小寫匹配您的ID ......

0

我只對你的$ siteId變量使用ToLower()。這就是我通常處理文本不區分大小寫的情況 - 只要確保所有文本都採用一致的格式即可。你也可以使用ToUpper()來實現這一點。

+0

感謝您的回覆。除了$ siteId,我們還想要轉換xml id。你能告訴我如何做到這一點。 – mahesh

+0

在發佈的代碼中,問題已經有'$ Siteid = $ Siteid.ToLower()',所以這個答案是多餘的,並且不提供真正的解決方案。 – wOxxOm

+0

@wOxxOm:糟糕。你是對的。查看代碼時我錯過了。 – breusshe

2

如果XML文件的問題(ToLower()是不夠的),你可以像這樣使用translate()來交換XML值中的大寫字母小寫。

translate(Value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') 

我個人開始將XML處理移動到System.Xml.Linq。更多的靈活性。一旦你掌握了它,它仍然很快,但更簡單。

+0

如果他們的ID使用擴展的拉丁字符或其他Unicode,該怎麼辦? – wOxxOm

+0

不是一個線索,從來沒有需要找出:) –

+0

那麼,這是一個修辭問題,這意味着這個技巧在這些情況下不起作用。 – wOxxOm