-1

我有一个带有如下命名空间的 XML。

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

我如何提取 x 路径并调用SelectSingleNode (* xpath *)。我开始了解注册命名空间,但我如何做到这一点并准确使用它还不清楚。谁能帮帮我:)

4

2 回答 2

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")

更新要在 xpath 中使用命名空间,您需要先在命名空间管理器中注册它。样本:

$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                                          
于 2013-05-15T12:10:36.130 回答
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'} 
于 2013-05-15T15:10:22.330 回答