很多朋友在网上看到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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
广播: PowerShell处理XML(二)加载和处理XML文件 | PowerShell 中文博客
广播: PowerShell处理xml时遇到的namespace陷阱 | PowerShell 中文博客