使用REXML访问xml文件

sample.xml中

   
MID-0000001 Bruce 0000001 ON-000000001 Alan 123-4567 West Seatle Credit Card 20 Points 22
3.1 A-0000001 Apple 2 5 4.1 P-0000001 Peach 4 6 5.1 O-0000001 Orange 2 4

xml.rb

 #!/usr/bin/ruby -w require 'rexml/document' include REXML xmlfile = File.new("sample.xml") xmldoc = Document.new(xmlfile) puts "MemberId:" + xmldoc.elements().to_a("ShipmentRequest/Message/Header/MemberId").first.text puts "MemberName:" + xmldoc.elements().to_a("ShipmentRequest/Message/Header/MemberName").first.text puts "DeliveryId:" + xmldoc.elements().to_a("ShipmentRequest/Message/Header/DeliveryId").first.text puts "ShipToName: " + xmldoc.elements().to_a("ShipmentRequest/Message/Header/ShipToName").first.text puts "ShipToZip: " + xmldoc.elements().to_a("ShipmentRequest/Message/Header/ShipToZip").first.text puts "ShipToStreet: " + xmldoc.elements().to_a("ShipmentRequest/Message/Header/ShipToStreet").first.text puts "ShipToCity: " + xmldoc.elements().to_a("ShipmentRequest/Message/Header/ShipToCity").first.text xmldoc.elements.each("ShipmentRequest/Message/Line/LineNumber") { |e| puts "LineNumber: " + e.text } xmldoc.elements.each("ShipmentRequest/Message/Line/ItemId") { |e| puts "ItemId: " + e.text } xmldoc.elements.each("ShipmentRequest/Message/Line/Description") { |e| puts "Description: " + e.text } xmldoc.elements.each("ShipmentRequest/Message/Line/Quantity") { |e| puts "Quantity: " + e.text } xmldoc.elements.each("ShipmentRequest/Message/Line/UnitCost") { |e| puts "UnitCost: " + e.text } 

我能够访问带有结果的元素:

 MemberId:MID-0000001 MemberName:Bruce DeliveryId:0000001 ShipToName: Alan ShipToZip: 123-4567 ShipToStreet: West ShipToCity: Seatle LineNumber: 3.1 LineNumber: 4.1 LineNumber: 5.1 ItemId: A-0000001 ItemId: P-0000001 ItemId: O-0000001 Description: Apple Description: Peach Description: Orange Quantity: 2 Quantity: 4 Quantity: 2 UnitCost: 5 UnitCost: 6 UnitCost: 4 

如何更改代码,以便我得到结果? :

 MemberId:MID-0000001 MemberName:Bruce DeliveryId:0000001 ShipToName: Alan ShipToZip: 123-4567 ShipToStreet: West ShipToCity: Seatle LineNumber: 3.1 ItemId: A-0000001 Description: Apple Quantity: 2 UnitCost: 5 LineNumber: 4.1 ItemId: P-0000001 Description: Peach Quantity: 4 UnitCost: 6 LineNumber: 5.1 ItemId: O-0000001 Description: Orange Quantity: 2 UnitCost: 4 

换句话说,我想以与xml文件中出现的相同顺序访问元素。

您需要迭代HeaderLine元素

 xmldoc.elements.each("ShipmentRequest/Message/Header") { |e| e.elements.each {|i| next if i.name.to_s.match(/Payments|PayType/); puts "#{i.name} : #{i.text}" } } xmldoc.elements.each("ShipmentRequest/Message/Line") { |e| e.elements.each {|i| puts "#{i.name} : #{i.text}" } } 

输出:

 MemberId : MID-0000001 MemberName : Bruce DeliveryId : 0000001 OrderNumber : ON-000000001 ShipToName : Alan ShipToZip : 123-4567 ShipToStreet : West ShipToCity : Seatle LineNumber : 3.1 ItemId : A-0000001 Description : Apple Quantity : 2 UnitCost : 5 LineNumber : 4.1 ItemId : P-0000001 Description : Peach Quantity : 4 UnitCost : 6 LineNumber : 5.1 ItemId : O-0000001 Description : Orange Quantity : 2 UnitCost : 4