2010-12-09 148 views
2

我正在尝试使用powershell命令select-xml从xml文件中选择数据。当我在下面运行命令时,不会返回任何结果或错误。我希望将这些版本的列表返回到屏幕上。这有什么问题?select-xml不会返回任何结果

PS C:\> select-xml -path "C:\t.xml" -xpath "//edition" | foreach {$_.node.InnerXML} 
PS C:\> 

XML文件(C:\ t.xml)是:

<?xml version="1.0" encoding="utf-8"?> 
    <Book> 
    <projects> 
     <project name="Book1" date="2009-01-20"> 
     <editions> 
      <edition language="English">En.Book1.com</edition> 
      <edition language="German">Ge.Book1.Com</edition> 
      <edition language="French">Fr.Book1.com</edition> 
      <edition language="Polish">Pl.Book1.com</edition> 
     </editions> 
     </project> 
    </projects> 
    </Book> 
+0

我看到它的工作 PS H:\ > Select-Xml -Path C:\ scripts \ t.xml -XPath“// edition”| %{$ _ node.InnerXML。} En.Book1.com Ge.Book1.Com Fr.Book1.com Pl.Book1.com PS H:\> – ravikanth 2010-12-09 10:46:44

回答

3

OK,所以我知道什么是错的。在XML声明的第一个节点之前有一个空白字符。真的很烦人。我想你的第一行:

PS H:\> $xml = ([xml](Get-Content -Path C:\scripts\t.xml)).Book.Projects.Project 

它误用:

” ..The XML声明必须是文档中 第一个节点,也没有 空白字符将被允许 出现在它之前...“

我确信select-xml在尝试读取xml文件时出现同样错误的问题会失败。 xml文件在IE中呈现良好。 。

3

只是另一种方式来做到这一点是:

PS H:\> $xml = ([xml](Get-Content -Path C:\scripts\t.xml)).Book.Projects.Project 
PS H:\> $xml.editions | select -ExpandProperty Edition 

language             #text 
--------             ----- 
English              En.Book1.com 
German              Ge.Book1.Com 
French              Fr.Book1.com 
Polish              Pl.Book1.com 
+0

运行第一行给了我一个错误,我然后用来解决问题。 +1为迈出答案的一步。 – Stagg 2010-12-09 11:58:46

1

$ _节点返回其不具有innerXml财产

Select-Xml -Path C:\t.xml -XPath "//edition" | 
    % {$_.node} | get-member | out-gridview 
1

这里,System.Xml.XmlElement一对夫妇更多的选择:

$xml = [xml]@' 
<?xml version="1.0" encoding="utf-8"?> 
<Book> 
    <projects> 
    <project name="Book1" date="2009-01-20"> 
     <editions> 
     <edition language="English">En.Book1.com</edition> 
     <edition language="German">Ge.Book1.Com</edition> 
     <edition language="French">Fr.Book1.com</edition>    
     <edition language="Polish">Pl.Book1.com</edition>   
     </editions>  
    </project>  
    </projects> 
</Book> 
'@ 

$xml | Select-Xml '//edition/text()' | Foreach {"$_"} 

$xml | Select-Xml '//edition' | Foreach {$_.Node.InnerText}