如何生成一个类似JSON的Ruby对象的XML表单



嗨,我需要生成一个像下面这样的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 模型中

最新更新