2012-12-03 58 views
3

使用以下xml文件,如何提取某些元標記的文本?例如,我想從屬性「角色」屬性的元標記中獲取文本「aut」。使用PowerShell從XML的元標記中提取文本

<?xml version="1.0" encoding="UTF-8"?> 
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="en" unique-identifier="pub- id" prefix="cc: http://creativecommons.org/ns#"> 
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/"> 
     <dc:title id="title">Moby-Dick</dc:title> 
     <meta refines="#title" property="title-type">main</meta> 
     <dc:creator id="creator">Herman Melville</dc:creator> 
     <meta refines="#creator" property="file-as">MELVILLE, HERMAN</meta> 
     <meta refines="#creator" property="role" scheme="marc:relators">aut</meta> 
     <dc:identifier id="pub-id">code.google.com.epub-samples.moby-dick-basic</dc:identifier> 
     <dc:language>en-US</dc:language> 
     <meta property="dcterms:modified">2012-01-18T12:47:00Z</meta> 
     <dc:publisher>Harper &amp; Brothers, Publishers</dc:publisher> 
     <dc:contributor id="contrib1">Dave Cramer</dc:contributor> 
     <meta refines="#contrib1" property="role" scheme="marc:relators">mrk</meta> 
     <dc:rights>This work is shared with the public using the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.</dc:rights>   
     <link rel="cc:license" href="http://creativecommons.org/licenses/by-sa/3.0/"/> 
     <meta property="cc:attributionURL">http://code.google.com/p/epub-samples/</meta> 
    </metadata> 
</package> 

我使用的SelectSingleNode()方法試過這樣沒有成功:

[xml]$doc = get-content myxmlfile.xml 
$node = $doc.selectsinglenode("/package/metadata/meta[@property='role']") 

//and 

$node = $doc.selectsinglenode("//meta[@property='role']") 

// $node is null for both cases 

我還使用選擇的XML這樣的嘗試:

[xml]$doc = get-content myxmlfile.xml 
Select-Xml -xml $doc -Xpath "/package/metadata/meta[@property='role']" 

//and 

Select-Xml -xml $doc -Xpath "//meta[@property='role']" 

回答

8

該標籤定義了一個默認名稱空間。您需要定義該默認名稱空間或使用通配符來避免指定名稱空間。後者是更容易:

select-xml -xml $xml -xpath "//*[@property='role']/text()" | % { $_.Node.Value } 

這裏有幾個引用: http://blog.stevex.net/xpath-and-xml-namespaces/ http://huddledmasses.org/xpath-and-namespaces-in-powershell/

+0

謝謝,那是我缺乏的新的XML解析信息。我將更多地研究命名空間,所以感謝鏈接。 –

+0

+1 ;-) ........ –

+0

哦,你! ;) 哈哈。 –

1

有這裏有幾種方法是:

[xml]$foo = Get-Content PATH\TO\FILE.xml 
$foo.package.metadata.meta | ?{$_.property -eq 'role'} | Select '#text' 

#text 
----- 
aut 
mrk 

這將得到兩個角色節點。要獲得AUT只是一個:

$foo.package.metadata.meta | ?{($_.property -eq 'role') -and ($_.refines -eq '#creator')} | Select '#text' 
+0

謝謝,這個工作,但是有沒有原因,我一直在嘗試,方法不起作用?它似乎在標籤不是「元」的其他示例中起作用。是否有關於PowerShell不喜歡的「meta」標籤? –

+0

@subject_x您的方法不起作用的原因是,如果您使用XPath,則需要引用正確的名稱空間。 Powershell的「原生」XML功能隱藏了這一點,所以當你說'$ foo.package.metadata.meta'時,'package'和'metadata'位於不同的命名空間並不重要。使用XPath,它可以。 –

2

這裏找到角色節點的方式:

$xmlFile = [xml](Get-Content C:\temp\meta.xml) 
$xmlFile.package.metadata.meta |Where-Object {$_.property -eq "role"} 
$xmlFile.package.metadata.meta |Where-Object {$_.property -eq "role"} | foreach {$_.innertext} 
+0

謝謝,這確實有用,但我想問你和我爲EBGreen所做的相同的問題。我的兩種方法怎麼不起作用?在另一個例子中,當沒有「meta」標籤時它似乎有效。 –

1

這會給你包含在每個「元」節點的文本:

PS> $xml = [xml](gc .\pkg.xml) 
PS> $xml.package.metadata.meta | % {write-output $_."#text"} 

輸出:

main 
MELVILLE, HERMAN 
aut 
2012-01-18T12:47:00Z 
mrk 
http://code.google.com/p/epub-samples/ 
相關問題