2013-05-15 107 views
-1

我有一個名稱空間如下的XML。用命名空間檢索XMl Xpath

<WDA.Application.Configuration xmlns="WDA.Application.Configuration"> 
     <Portals> 
     <Portal PortalID="jhgjuhu6yu8678" Type="default" /> 
     </Portals> 
    </WDA.Application.Configuration> 

我如何可以提取X路徑,並呼籲的SelectSingleNode(* 的XPath *)。我才知道有關注冊命名空間,但如何做到這一點,並用它到底是不是clear.Can任何人請幫助我:)

+0

你有什麼要求什麼呢? –

+0

我想改變PortalId的值,爲此我需要檢索它的XPATH.But,因爲xml名稱空間,我無法獲得該節點。請幫助我:) – user1595214

回答

2

因爲我不熟悉多個命名空間,所以我還沒有想出xpath,但爲什麼不使用powershell xml解析器?

$xml = [xml](Get-content c:\myfile.xml) 

#GetElementsByTagName(tagname, namespace) 
$xml.GetElementsByTagName("WDA.Application.Configuration", "WDA.Application.Configuration") | 
ForEach-Object { 
    $_.Portals.Portal.PortalID = "testvalueforportalid" 
    } 

$xml.Save("c:\myfile.xml") 

UPDATE要XPath中使用的命名空間,則需要在namespacemanager第一註冊。示例:

$xml = [xml](Get-Content .\test.xml) 
$ns = New-Object Xml.XmlNamespaceManager $xml.NameTable 
$ns.AddNamespace("ns1", "WDA.Application.Configuration") 
$xml.SelectSingleNode('//ns1:WDA.Application.Configuration', $ns) 


xmlns            Portals           
-----            -------           
WDA.Application.Configuration      Portals           
+0

實際上有多個節點喜歡他,我想要編輯。所以我不想保留它特定於此代碼,而是我想使用x路徑到達節點。 – user1595214

+0

請參閱xpath解決方案的更新。如果有多個節點,可以使用'where'('?')和foreach進行過濾。 xpath不是PowerShell中的唯一方法=) –

0

請注意,屬性通常不是命名空間限定的。在這種情況下,你不需要使用命名空間的混亂如果只有你正在尋找例如,單個PortalID:

$xml = [xml]@' 
<WDA.Application.Configuration xmlns="WDA.Application.Configuration"> 
     <Portals> 
     <Portal PortalID="jhgjuhu6yu8678" Type="default" /> 
     </Portals> 
    </WDA.Application.Configuration> 
'@ 

$xml | Select-Xml -XPath '//@PortalID' | Foreach {$_.Node.'#text' = 'abcd'} 
$xml | Format-Xml 

輸出:

<WDA.Application.Configuration xmlns="WDA.Application.Configuration"> 
    <Portals> 
    <Portal PortalID="abcd" Type="default" /> 
    </Portals> 
</WDA.Application.Configuration> 

注意Format-XmlPSCX小命令。

如果你需要使用的命名空間的特定元素過濾,然後你可以把那些在哈希表中並通入Select-Xml像這樣:

... | Select-Xml -XPath '//dns:Portal' -Namespace @{dns='WDA.Application.Configuration'}