PowerShell操作XML遇到的问题
2012-05-23 17:10
197 查看
今天使用PowerShell来操作XML遇到两个问题,之前一直用的C#操作XML,所以我想在PowerShell上应该跟C#一样的。
先准备好XML文件如下,我给它命名test.xml
然后下面是一段简单的C#的代码,来获取上述XML文件中的节点
工作一切正常,现在将它改写成PowerShell来操作,代码如下:
两个都是用的.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()方法来获取。
好吧!问题又来了,这次是
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#中实现的索引方法?
又再次修改脚本如下,终于解决问题,但是疑问仍在。特此记录一下。看是否有高手回答一下!?呵呵
先准备好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")
相关文章推荐
- PowerShell操作XML遇到的问题
- XML文本的序列化与反序列化的操作,与遇到的问题
- 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
- 操作XML文档遇到的XMLNS问题及解决方法 (C# 和 PHP)
- 操作 XML 文档遇到的 XMLNS 问题及解决方法 (C# 和 PHP)
- 学习之路十二:SQL Server操作XML以及遇到的问题
- 关于JQUERY操作XML问题!
- java操作postgreSql遇到的问题
- XSL 转化XML到XML遇到的几个问题
- 操作win8系统时遇到无法拖动桌面图标问题的解决方法
- 操作dosbox0.74时遇到的几个问题
- 遇到问题----MongoDB---JAVA--大批量操作先删后存时偶尔出现保存的文档也被删除
- 【studio导入module遇到问题一】:Gradle build-info.xml not found for moudle..Please make sure..gradle plugin
- 又一次遇到+=操作的隐藏转型问题。
- 对于数据库操作可能会遇到的问题(空值问题以及出现的参数不能被重复使用问题)
- spring.xml遇到的一些问题1
- ASIHTTPRequest包引入的时候遇到的问题libxml/HTMLparser.h file not found
- Git远程库操作遇到的一些问题
- eclipse导入已存在的android工程时遇到AndroidManifest.xml文件出错的问题(红叉)
- 采用xstream实现javabean和xml互转时遇到的问题