24cun_cn 发表于 2018-9-3 08:53:27

PowerShell操作XML遇到的问题

  今天使用PowerShell来操作XML遇到两个问题,之前一直用的C#操作XML,所以我想在PowerShell上应该跟C#一样的。
  先准备好XML文件如下,我给它命名test.xml
  


[*]
[*]
[*]
[*]   
[*]      Joe
[*]      17
[*]   
[*]   
[*]      Kate
[*]      12
[*]   
[*]
[*]
[*]   
[*]      David
[*]      23
[*]   
[*]   
[*]      Eath
[*]      54
[*]   
[*]
[*]
  

  然后下面是一段简单的C#的代码,来获取上述XML文件中的节点

  


[*]static void Main(string[] args)
[*]      {
[*]            XmlDocument doc = new XmlDocument();
[*]            doc.Load("test.xml");
[*]
[*]            XmlElement root = doc.DocumentElement;
[*]            XmlNodeList users = root.SelectNodes("users");
[*]
[*]            Console.WriteLine(users.OuterXml);
[*]            Console.WriteLine(users.Attributes["job"].Value);
[*]      }
[*]
  

工作一切正常,现在将它改写成PowerShell来操作,代码如下:
  


[*]$doc=new-object System.xml.XmlDocument
[*]$doc.load("test.xml")
[*]$root=$doc.DocumentElement
[*]$users=$root.SelectNodes("users")
[*]
[*]write-host $users.outerxml
[*]write-host $users.Attributes["job"].value
  

  两个都是用的.net 2.0框架。
  PS脚本就在运行的时候出错了,错误原因是
  Unable to index into an object of type System.Xml.XPathNodeList
  为什么在C#里可以使用索引,在PS里面就不行哩?
  在网上苦寻半天,勉强算是找到一个答案
  http://connect.microsoft.com/PowerShell/feedback/details/339557/ctp-unable-to-index-into-an-object-of-type-system-management-managementobjectcollection
  This is by design.

  
ManagementObjectCollection>  同理也就是说类XPathNodeList没有实现索引器,那为什么C#里又可以?
  XPathNodeList类是个内部类,MSDN上可没有解释,只能通过Reflector来查看。
  这个网址也能查看:
  http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Xml&type=XPathNodeList
  可以知道它继承自XmlNodeList,查看XmlNodeList可以知道它实现了索引器方法,所以在C#里就可以调用了。
  那PowerShell不能调用的原因就是它只能查找到本类的实现方法或者属性,无法去调用父类的方法或者属性咯!?
  修改PowerShell脚本如下,通过item()方法来获取。
  


[*]$doc=new-object System.xml.XmlDocument
[*]$doc.load("D:\workspace\TestFolder\ConsoleApplication\PowershellXMLTest\test.xml")
[*]$root=$doc.DocumentElement
[*]$users=$root.SelectNodes("users")
[*]
[*]write-host $users.item(0).outerxml
[*]write-host $users.item(0).Attributes["job"].value
  

  好吧!问题又来了,这次是
  Unable to index into an object of type System.Xml.XmlAttributeCollection
  查看源代码,发现它实现了索引方法的啊?什么原因?
  难道是PS不支持C#中实现的索引方法?
  又再次修改脚本如下,终于解决问题,但是问题仍在。特此记录一下。
  


[*]$doc=new-object System.xml.XmlDocument
[*]$doc.load("D:\workspace\TestFolder\ConsoleApplication\PowershellXMLTest\test.xml")
[*]$root=$doc.DocumentElement
[*]$users=$root.SelectNodes("users")
[*]
[*]write-host $users.item(0).outerxml
[*]write-host $users.item(0).GetAttribute("job")
  



页: [1]
查看完整版本: PowerShell操作XML遇到的问题