【问题标题】:selecting specific node with xpath in powershell在 powershell 中使用 xpath 选择特定节点
【发布时间】:2019-05-16 00:41:21
【问题描述】:

我正在尝试选择 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

返回:

&lt;Token Include="{AB_ANALYTICSSERVER}" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;&lt;Value&gt;Test&lt;/Value&gt;&lt;/Token&gt;

但是这些都没有返回任何东西:

$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 没有。

我缺少什么明显的东西? :/

谢谢

【问题讨论】:

  • Project 元素上设置的默认命名空间。

标签: xml powershell


【解决方案1】:

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

但是,您可以滥用 PowerShell 的功能,只需访问 Token,就好像它是一个对象结构一样。

$xmlNew.Project.ItemGroup.Token.outerxml

您也可以使用Select-Xml cmdlet 并使用您的XPath 明确指定命名空间,如this answer 中所示。

$ns = @{dns = 'http://schemas.microsoft.com/developer/msbuild/2003'}
Select-Xml -Xml $xmlNew -XPath '//dns:Token' -Namespace $ns

【讨论】:

  • 原谅我的无知,但我试图按照您链接中的示例进行操作,但无法使其工作:$ns =@{dns="schemas.microsoft.com/developer/msbuild/2003"} $tokens = Select -Xml -Xml $xmlnew -XPath '//dns:token' -命名空间 $ns $tokens | Foreach {$_.Node.Name}
  • @MalcolmLock 可能是您的 XPath 中存在区分大小写的问题,我在答案中添加了一个工作示例。
  • 如果您在最后 5 分钟内尝试了我的代码,则其中有错误。我的错。
  • 谢谢!我仍然无法让 selectnodes 和 selectsinglenode 与 NS 一起使用,但我认为这可以满足我的需求。
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多