2010-12-09 146 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}