2015-04-06 65 views
2

一个XML文档我有一个简单的XML文档,看起来像下面这样:导航与引入nokogiri

<Lineup> 
<Player> 
    <GameID>20150010</GameID> 
    <GameDate>2015-04-06T00:00:00-04:00</GameDate> 
    <DH>0</DH> 
    <TeamId>16</TeamId> 
    <PlayerId>458913</PlayerId> 
    <LineupPosition>1</LineupPosition> 
    <DefensivePosition>8</DefensivePosition> 
    </Player> 
    <Player> 
    <GameID>20150010</GameID> 
    <GameDate>2015-04-06T00:00:00-04:00</GameDate> 
    <DH>0</DH> 
    <TeamId>16</TeamId> 
    <PlayerId>607054</PlayerId> 
    <LineupPosition>2</LineupPosition> 
    <DefensivePosition>4</DefensivePosition> 
    </Player> 
    <Player> 
    <GameID>20150010</GameID> 
    <GameDate>2015-04-06T00:00:00-04:00</GameDate> 
    <DH>0</DH> 
    <TeamId>16</TeamId> 
    <PlayerId>455976</PlayerId> 
    <LineupPosition>3</LineupPosition> 
    <DefensivePosition>9</DefensivePosition> 
    </Player> 
</Lineup> 

我通过各选手客体试图环和单独访问每一个子节点及其相应的价值。我想类似如下:

xml_doc.xpath("//Lineup/Player").each do |lineup| 
    puts "lineup: #{lineup.inspect}" 
end 

我不完全知道如何访问lineup各个子元素在这里虽然。使用nokogiri做这件事的最好方法是什么?

+0

你意思是['Nokogiri :: XML :: Node.children'](http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/XML/Node)? – tadman

回答

2

尝试使用XPath /Lineup/Player/*检查每个“播放器”节点的每个子元素:

doc = Nokogiri::XML(File.read('my.xml')) 
doc.xpath('/Lineup/Player/*').each do |node| 
    puts "#{node.name}: #{node.text}" 
end 
# GameID: 20150010 
# GameDate: 2015-04-06T00:00:00-04:00 
# DH: 0 
# ...etc... 

或者,您也可以选择每个“播放器”,并遍历其element children (by using #elements or #element_children)

doc.xpath('/Lineup/Player').each do |player| 
    puts "-- NEXT PLAYER --" 
    player.elements.each do |node| 
    puts "#{node.name}: #{node.text}" 
    end 
end 
+0

感谢您的回答。我希望能够在迭代中执行如下操作:'foo = player.foo',所以我不需要检查每个迭代中的'node.name'。这也是可能的吗? – randombits

+1

@randombits:不是直接的,但你可以创建一个“播放器”工厂或构造函数,它需要一个播放器元素并填充这些访问器函数所需的成员变量(或者使用['#method_missing'](http:// ruby​​- doc.org/core-2.1.0/BasicObject.html#method-i-method_missing))。 – maerics