2017-08-15 39 views
0

我有一個具有metadata.xml文件:紅寶石引入nokogiri不讀我的XML文件

<MediaItem ActualEndTime="8/2/2017 5:05:01 PM" ActualStartTime="8/2/2017 4:00:01 PM" Clip="False" ClipEndTime="1/1/0001 12:00:00 AM" ClipParentId="00000000-0000-0000-0000-000000000000" ClipStartTime="1/1/0001 12:00:00 AM" CreatedDate="1/1/0001 12:00:00 AM" DateAdded="1/1/0001 12:00:00 AM" Duration="01:04:59.8290000" FileFormat="0" FileSize="0" Genre="Interview" GuideEndTime="8/2/2017 5:00:00 PM" GuideStartTime="8/2/2017 4:00:00 PM" MovieId="00000000-0000-0000-0000-000000000000" MovieYear="0" NumParts="0" OriginalAirDate="8/2/2017 12:00:00 AM" OriginalFileSize="3636725627" PartNum="0" RecordingType="Episodic" ShowSqueeze="True" TargetEndTime="8/2/2017 5:05:00 PM" TargetStartTime="8/2/2017 4:00:00 PM" UserId="" VideoHeight="0" VideoWidth="0" /> 

如何使用Ruby和引入nokogiri解析呢?
我已經試過:

f = File.open path 
puts "f : #{f}" 
metadata = {} 
doc = Nokogiri::XML(f) 
puts "doc : #{doc}" 
p = doc.xpath("//ActualStartTime") 
puts "p : #{p}" 
puts "++++++++++++++++++++++++++++++++++++++" 

,但我得到這樣的輸出:

f : #<File:0x00000002755c40> 
doc : <?xml version="1.0"?> 
p : 
+++++++++++++++++++++++++++++++++++++++++++ 

我缺少什麼?我想獲得ActualStartTime值,Duration值和Genre值。

更新

metadata = {} 
f = File.read(path) 
puts "f : #{f}" 
doc = Nokogiri::XML(f) 
p = doc.xpath("//@ActualStartTime") 
puts "p : #{p}" 
metadata['Duration'] = doc.xpath("//MediaItem/@Duration") 
puts "metadata['Duration'] : #{metadata['Duration']}"  

輸出:

f : <MediaItem ActualEndTime="8/2/2017 5:05:01 PM" ActualStartTime="8/2/2017 4:00:01 PM" Clip="False" ClipEndTime="1/1/0001 12:00:00 AM" ClipParentId="00000000-0000-0000-0000-000000000000" ClipStartTime="1/1/0001 12:00:00 AM" CreatedDate="1/1/0001 12:00:00 AM" DateAdded="1/1/0001 12:00:00 AM" Duration="01:04:59.8290000" FileFormat="0" FileSize="0" Genre="Interview" GuideEndTime="8/2/2017 5:00:00 PM" GuideStartTime="8/2/2017 4:00:00 PM" MovieId="00000000-0000-0000-0000-000000000000" MovieYear="0" NumParts="0" OriginalAirDate="8/2/2017 12:00:00 AM" OriginalFileSize="3636725627" PartNum="0" RecordingType="Episodic" ShowSqueeze="True" TargetEndTime="8/2/2017 5:05:00 PM" TargetStartTime="8/2/2017 4:00:00 PM" UserId="" VideoHeight="0" VideoWidth="0" /> 
p : 
metadata['Duration'] : 

回答

3

opening the file,但你從來沒有真正讀取文件內容(以及後不關閉文件)。您可以通過

begin 
    file = File.open './metadata.xml' 
    f = file.read 
ensure 
    file.close 
end 

或通過快捷方式之一讀取文件:

# closes file after block finishes 
f = File.open('./metadata.xml') { |f| f.read } 

,或者因爲閱讀是這樣一個共同的東西,你可以使用File.read

f = File.read('./metadata.xml') 

現在Nokogiri會閱讀f就好了,儘管您需要使用

p = doc.xpath("//@ActualStartTime") 

因爲它是一個屬性。

+1

...或者,如果您需要進行更具體的搜索,那麼'「// MediaItem/@ ActualStartTime」 –

+0

@Simple Lime謝謝,但解決方案部分正常。我更新了這個問題。 – mamesaye

+0

@Tom Lord答案不起作用。我更新了這個問題。 – mamesaye