Converting OpenStruct/Hash to XML

Foxscape

New Member
I have a collection of OpenStruct elements using which I need to build an XML with help of Nokogiri. \[code\]collection = [OpenStruct.new(:catalogStoreNumber => '657758',:catalogStoreId => 'CTH6536',:catalogStoreLocation => 'UnitedStates', :catalogOwnerId => 'TYCT11190',:catalogOwner => 'McGrawHill Pub.',:catalogList => OpenStruct.new( :catalogProductInfo => OpenStruct.new( :productType => 'Book', :productName => 'The Client', :productAuthorized => 'Y', :productId => 'BKSUS113246A', :productVerificationCode => '4546747', :productPurcTransactionTime => '2012-05-21T13:36:38+05:30', :productAuditDetails => OpenStruct.new( :productAuditNo => '1', :prodHandledByUser => 'StoreUserS14', :productAuditTime => '2012-05-21T13:36:38+05:30', :productAuditAdminId => 'McGr1132', :productPurchaseRate => '50.14 Prcnt', :productSystemLoggerId => 'UNX-NETW4536' ), :productAuditDetails => OpenStruct.new( :productAuditNo => '2', :prodHandledByUser => 'OnlineUserOn008', :productAuditTime => '2012-05-23T16:16:08+05:30', :productAuditAdminId => 'McGr1132', :productPurchaseRate => '84.86 Prcnt', :productSystemLoggerId => 'UNX-NETW4536' ) ),:catalogProductInfo => OpenStruct.new( :productType => 'Pen', :productName => 'Reynolds' :productAuthorized => 'N', :productId => 'PNSUS228886B', :productVerificationCode => '2330076', :productPurcTransactionTime => '2012-04-22T15:06:18+04:30', :productAuditDetails => OpenStruct.new( :productAuditNo => '1', :prodHandledByUser => 'CCUserA14', :productAuditTime => '2012-04-26T13:36:38+05:30', :productAuditAdminId => 'ReyGr1132', :productPurchaseRate => '20.19 Prcnt', :productSystemLoggerId => 'WIN-NETW4536' ) ) ))] \[/code\]I tried with below code .. as per your answer (handpick of elements)\[code\]builder = Nokogiri::XML::Builder.new do |xml| xml.CatalogOrder do collection.each do |ctlg| xml.CatalogStoreNumber ctlg.catalogStoreNumber xml CatalogStoreId ctlg.catalogStoreId xml.CatalogOwnerId ctlg.catalogOwnerid xml.CatalogOwner ctlg.catalogOwner xml.CatalogList do prod_count = 0 aud_list_count = 0 collection.each do |prod| info = prod.catalogList[0].catalogProductInfo xml.ProductInfo do xml.ProductType info.productType xml.ProductName info.productName xml.ProductId info.productId xml.ProductVerificationCode info.ProductVerificationCode xml.ProductPurcTransactionTime info.productPurcTransactionTime xml.ProductAuditDetails do collection.each do |aud_dtl| aud_info = aud_dtl.catalogList[0].catalogProductinfo[0].productAuditDetails xml.ProductAuditNo aud_info.productAuditNo xml.ProdHandledByUser aud_info.prodHandledByUser xml.ProductAuditTime aud_info.productAuditTime xml.ProductAuditAdminId aud_info.productAuditAdminId xml.ProductPurchaseRate aud_info.productPurchaseRate xml.ProductSystemLoggerId aud_info.productSystemLoggerId # Do whatever you must above to concoct your ProductId end aud_list_count = aud_list_count + 1 end prod_count = prod_count + 1 end end end puts builder.to_xml\[/code\]I need the Output as below...\[code\]<CatalogOrder> <CatalogStoreNumber>657758</CatalogStoreNumber> <CatalogStoreId>CTH6536</CatalogStoreId> <CatalogStoreLocation>UnitedStates</CatalogStoreLocation> <CatalogOwnerId>TYCT11190</CatalogOwnerId> <CatalogOwner>McGrawHill Pub.</CatalogOwner> <CatalogList> <CatalogProductInfo> <ProductType>Book</ProductType> <ProductName>The Client</ProductName> <ProductAuthorized>Y</ProductAuthorized> <ProductId>BKSUS113246A</ProductId> <ProductVerificationCode>4546747</ProductVerificationCode> <ProductPurcTransactionTime>2012-05-21T13:36:38+05:30</ProductPurcTransactionTime> <ProductAuditDetails> <ProductAuditNo>1</ProductAuditNo> <ProdHandledByUser>StoreUserS14</ProdHandledByUser> <ProductAuditTime>2012-05-21T13:36:38+05:30</ProductAuditTime> <ProductAuditAdminId>McGr1132</ProductAuditAdminId> <ProductPurchaseRate>50.14 Prcnt</ProductPurchaseRate> <ProductSystemLoggerId>WIN-NETW4536</ProductSystemLoggerId> </ProductAuditDetails> <ProductAuditDetails> <ProductAuditNo>2</ProductAuditNo> <ProdHandledByUser>OnlineUserOn008</ProdHandledByUser> <ProductAuditTime>2012-05-23T16:16:08+05:30</ProductAuditTime> <ProductAuditAdminId>McGr1132</ProductAuditAdminId> <ProductPurchaseRate>84.86 Prcnt</ProductPurchaseRate> <ProductSystemLoggerId>UNX-NETW4536</ProductSystemLoggerId> </ProductAuditDetails> </CatalogProductInfo> <CatalogProductInfo> <ProductType>Pen</ProductType> <ProductName>Reynolds</ProductName> <ProductAuthorized>N</ProductAuthorized> <ProductId>PNSUS228886B</ProductId> <ProductVerificationCode>2330076</ProductVerificationCode> <ProductPurcTransactionTime>2012-04-22T15:06:18+04:30</ProductPurcTransactionTime> <ProductAuditDetails> <ProductAuditNo>1</ProductAuditNo> <ProdHandledByUser>CCUserA14</ProdHandledByUser> <ProductAuditTime>2012-04-26T13:36:38+05:30</ProductAuditTime> <ProductAuditAdminId>ReyGr1132</ProductAuditAdminId> <ProductPurchaseRate>20.19 Prcnt</ProductPurchaseRate> <ProductSystemLoggerId>WIN-NETW4536</ProductSystemLoggerId> </ProductAuditDetails> </CatalogProductInfo> </CatalogList></CatalogOrder> \[/code\]I tried to loop in the nested Array of OpenStruct of elements, but couldn't land on right logic for that .. Ref.. How to add child nodes in NodeSet using Nokogiri
 
Back
Top