PowerShell 基于Namespace来SelectNode 2


很多朋友在网上看到PowerShell处理xml文档时,用到了一个selectNode。但是有时候照猫画虎,就是看不到期望的结果。原因可能是因为你的XML文档中多了个命名空间(Namespace)。没有命名空间时,Name就是Name,有了命名空间后,Name=Namespace+Name

看下面的例子,有一个XML文档,要求输出“Obj”的结点信息。

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <Obj RefId="0">
    <TN RefId="0">
      <T>Selected.System.IO.FileInfo</T>
      <T>System.Management.Automation.PSCustomObject</T>
      <T>System.Object</T>
    </TN>
    <MS>
      <S N="Name">test.txt</S>
      <I64 N="Length">143</I64>
      <DT N="CreationTime">2013-12-01T20:05:22.5568032+08:00</DT>
    </MS>
  </Obj>
</Objs>

如果照猫画虎地朋友这样用,肯定什么都不会输出:

$xml.DocumentElement.SelectNodes("/Objs/Obj")

应当这样用:

$xml=[xml](Get-Content .\xml.xml)
$ns= new-object System.Xml.XmlNamespaceManager $xml.NameTable
$ns.AddNamespace("myNS", $xml.DocumentElement.NamespaceURI)
$xml.DocumentElement.SelectNodes("//myNS:Objs//myNS:Obj",$ns)

具体用到的.NET方法,可以参考MSDN

但是我一般不用XML中的SelectNodes,PowerShell中有更方便的方法,请看:

PS> $xml.Objs.Obj 

RefId TN MS
----- -- --
0     TN MS
本文链接: https://www.pstips.net/xml-selectnode-against-namespace.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

2 条评论 “PowerShell 基于Namespace来SelectNode