PowerShell操作XML遇到的問題


今天使用PowerShell來操作XML遇到兩個問題,之前一直用的C#操作XML,所以我想在PowerShell上應該跟C#一樣的。

先准備好XML文件如下,我給它命名test.xml

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
  <users job="salas"> 
    <user> 
      <name>Joe</name> 
      <age>17</age> 
    </user> 
    <user> 
      <name>Kate</name> 
      <age>12</age> 
    </user> 
  </users> 
  <users job="developer"> 
    <user> 
      <name>David</name> 
      <age>23</age> 
    </user> 
    <user> 
      <name>Eath</name> 
      <age>54</age> 
    </user> 
  </users> 
</root> 

 

然后下面是一段簡單的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[0].OuterXml); 
            Console.WriteLine(users[0].Attributes["job"].Value); 
        }

 

 

工作一切正常,現在將它改寫成PowerShell來操作,代碼如下:

$doc=new-object System.xml.XmlDocument 
$doc.load("test.xml") 
$root=$doc.DocumentElement 
$users=$root.SelectNodes("users")

write-host $users[0].outerxml 
write-host $users[0].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 class does not have an indexer.

同理也就是說類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("test.xml") 
$root=$doc.DocumentElement 
$users=$root.SelectNodes("users")

$users|Get-Member

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

查看源代碼

http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Xml&type=XmlAttributeCollection

發現它實現了索引方法的啊?什么原因?

難道是PS不支持C#中實現的索引方法

又再次修改腳本如下,終於解決問題,但是疑問仍在。特此記錄一下。看是否有高手回答一下!?呵呵

$doc=new-object System.xml.XmlDocument 
$doc.load("test.xml") 
$root=$doc.DocumentElement 
$users=$root.SelectNodes("users")

write-host $users.item(0).outerxml 
write-host $users.item(0).GetAttribute("job")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM