我有一个带有命名空间的XML,如下所示。
<WDA.Application.Configuration xmlns="WDA.Application.Configuration">
<Portals>
<Portal PortalID="jhgjuhu6yu8678" Type="default" />
</Portals>
</WDA.Application.Configuration>
如何提取x路径并调用 SelectSingleNode (* xpath *)。我开始了解注册命名空间,但我该怎么做并使用它确切地说不清楚。任何人都可以帮助我:)。
答案 0 :(得分:2)
我还没有弄清楚xpath,因为我不熟悉多个命名空间,但为什么不使用powershell xml-parser?
$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
答案 1 :(得分: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-Xml
是PSCX cmdlet。
如果您需要使用命名空间来过滤特定元素,那么您可以将它们放在哈希表中并传递到Select-Xml
,如下所示:
... | Select-Xml -XPath '//dns:Portal' -Namespace @{dns='WDA.Application.Configuration'}