嗨,我需要生成一个像下面这样的XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Addresses>
<CurrentAddress>
<Country>United Kingdom</Country>
<ZipPostcode>OX4 2QX</ZipPostcode>
<AddressLine1>36 Brasenose Driftway</AddressLine1>
<AddressLine2>Oxford</AddressLine2>
<AddressLine3 />
<FirstYearOfResidence>2002</FirstYearOfResidence>
<LastYearOfResidence>2014</LastYearOfResidence>
</CurrentAddress>
<PreviousAddress1>
<Country>United Kingdom</Country>
<ZipPostcode>AB1 1AA</ZipPostcode>
<AddressLine1>21 A Street</AddressLine1>
<AddressLine2>Aberdeen</AddressLine2>
<AddressLine3 />
<FirstYearOfResidence>1998</FirstYearOfResidence>
<LastYearOfResidence>2002</LastYearOfResidence>
</PreviousAddress1>
</Addresses>
即,我只需要一个"地址"块,但我有一些问题我当前的对象表示:
address_count = 0
running = []
@person.addresses.each do |address|
Rails.logger.debug 'Adding address'
if address_count == 0
Rails.logger.debug 'Adding current address'
running.push(
CurrentAddress: {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
)
else
Rails.logger.debug 'Adding previous address'
running.push(
"PreviousAddress#{address_count}" => {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
)
end
address_count += 1
end
JSON中的代码如下:
{
"Addresses": [
{
"CurrentAddress": {
"Country": "United Kingdom",
"ZipPostcode": "OX4 2QX",
"AddressLine1": "36 Brasenose Driftway",
"AddressLine2": "Oxford",
"AddressLine3": null,
"FirstYearOfResidence": 2002,
"LastYearOfResidence": 2014
}
},
{
"PreviousAddress1": {
"Country": "United Kingdom",
"ZipPostcode": "AB1 1AA",
"AddressLine1": "21 A Street",
"AddressLine2": "Aberdeen",
"AddressLine3": null,
"FirstYearOfResidence": 1998,
"LastYearOfResidence": 2002
}
}
]
}
这实际上生成了一个包含两个"地址"块的XML。
有人知道我如何生成对象的表示形式(如果不是JSON,也可以),在XML转换后看起来像我需要的那样?
我还考虑直接生成XML。在这种情况下,我如何从上面发布的Ruby Hash中生成我需要的XML?
为了记录在案,我需要它,因为我正在使用SAVON(Ruby的SOAP客户端)。
非常感谢!
运行不应该是数组,而应该是散列。通过这种方式,您可以将不同的地址与不同的密钥(CurrentAddress、PreviousAddress1等)关联起来
最后,您创建了一个新的散列,将整个对象"running"与键"Addresses"关联起来。
def addresses_as_xml
address_count = 0
running = Hash.new
@person.addresses.each do |address|
if address_count == 0
Rails.logger.debug 'Adding current address'
running["CurrentAddress"] = {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
else
Rails.logger.debug 'Adding previous address'
running["PreviousAddress#{address_count}"] = {
Country: address.country,
ZipPostcode: address.postcode,
AddressLine1: address.line1,
AddressLine2: address.line2,
AddressLine3: address.town_city,
FirstYearOfResidence: address.from_year,
LastYearOfResidence: address.to_year
}
end
address_count += 1
end
person_summary = {"Addresses" => running}
person_summary.to_xml
end
另一句话:在我看来,这个方法只对Person对象的地址进行操作=>也许它应该位于Person 模型中