zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    poj 2481
    poj 3928 Ping pong
    再见oi
    NOIP 2014 解方程
    poj1836:Alignment
    poj2479:Maximum sum
    tyvj1510:专家复仇
    tyvj:P1467 通向聚会的道路
    tyvj1176: 火焰巨魔的惆怅
    tyvj1326:剑人合一
  • 原文地址:https://www.cnblogs.com/heqichang/p/2515054.html
Copyright © 2011-2022 走看看