【问题标题】:How to generate an XML form a JSON like Ruby object如何生成 XML 格式的 JSON 像 Ruby 对象
【发布时间】:2015-04-06 22:26:30
【问题描述】:

您好,我需要生成一个如下所示的 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 客户端)。

非常感谢!

【问题讨论】:

    标签: ruby-on-rails ruby xml json savon


    【解决方案1】:

    running 不应该是一个数组,而是一个哈希。这样您就可以将不同的地址与不同的键(CurrentAddress、PreviousAddress1 等)关联起来

    最后,您创建一个新的哈希,将整个“运行”对象与“地址”键关联起来。

    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-object 的地址起作用 => 也许它应该位于模型 Person 中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2010-09-06
      • 1970-01-01
      • 2014-08-29
      相关资源
      最近更新 更多