2017-08-15 63 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