在PowerShell中选择带有xpath的特定节点

时间:2019-05-15 14:05:22

标签: xml powershell

我正在尝试选择xml文件中的特定节点,以将其与另一个文件中的相同节点进行比较。

我可以使用通用节点浏览文件,但是我不知道如何获取确切的Xpath。

这是XML:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Domain wide values -->
  <PropertyGroup>
    <LoggingLevel>0</LoggingLevel>
    <LongTimeouts>0</LongTimeouts>
  </PropertyGroup>
  <ItemGroup>
    <!--AB-->
    <Token Include="{AB_ANALYTICSSERVER}">
      <Value>Test</Value>
    </Token>
    <Token Include="{AB_CERTFINDVALUE}">
      <Value>$(CertName)</Value>
    </Token>
    <Token Include="{AB_SERVICECERTFINDVALUE}">
      <Value>$(CertName)</Value>
    </Token>
    <Token Include="{AB_CONSUMERSGROUP}">
      <Value>DLG-AB-users</Value>
    </Token>
    <!--AB End-->
    <!--Database-->
    <Token Include="{Database_Domain}">
      <Value>$(Domain)</Value>
    </Token>
    <Token Include="{Audit_Domain}">
      <Value>$(Domain)</Value>
    </Token>
    <!--Database End-->
  </ItemGroup>
</Project>

但是我显然在基于xpath的查询中缺少一些内容:

例如 $xmlNew.SelectNodes("/node()[1]/node()[3]/node()[2]").outerxml

返回:

<Token Include="{AB_ANALYTICSSERVER}" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Value>Test</Value></Token>

但这些都不返回任何内容:

$xmlNew.SelectNodes("/Project/ItemGroup/Token").outerxml

$xmlnew.selectnodes('//token[contains(@Include,"{AB_ANALYTICSSERVER}")]').OuterXml

类似地可行:

$xmlNew.SelectNodes("/node()[1]/node()[2]/node()[2]").outerxml

但这不是:

$xmlnew.selectnodes('/Project/PropertyGroup/LongTimeouts').outerxml没有。

我想念什么明显的东西? :/

谢谢

1 个答案:

答案 0 :(得分:2)

问题是您的XPath由于名称空间而无效。

但是,您可以滥用PowerShell的功能,只需访问print("view did load : MainViewController") ,就好像它是对象结构一样。

Token

您还可以使用$xmlNew.Project.ItemGroup.Token.outerxml cmdlet并通过XPath显式指定命名空间,如this answer中所示。

Select-Xml