Como adicionar nós filhos no NodeSet usando o Nokogiri

Eu estou tentando adicionar nós filhos sob um nó raiz .. Eu tentei com xml abaixo, mas isso não funciona. Eu sou novato para Ruby e Nokogiri

builder = Nokogiri::XML::Builder.with(@doc) do |xml|   
  nodes = Nokogiri::XML::NodeSet.new(@doc, [])   
  [].each {|nodes_one_by_one|  
    << nodes_one_by_one.Book  
    << nodes_one_by_one.Pen 
  }      
end  

Eu preciso adicionar nós abaixo de um nó raiz como este

<Catalog>
    <Book>abc</Book>
    <Book_Author>Benjamin</Book_author>

Isso funciona bem para mim .. mas o que eu preciso exatamente é adicionar esses nós depois de uma posição específica no documento.

<Catalog>
    <!-- 
    <Book>abc</Book>
    <Book_Author>Benjamin</Book_author>
    -->
    <Interface></Interface>
    <Dialog></Dialog>
    <Manifest></Manifest>
</Catalog>

Eu tentei com at_xpath ('// Catlog') mas está adicionando no final do elemento (como você disse)

 <Catalog>
    <Interface></Interface>
    <Dialog></Dialog>
    <Manifest></Manifest>
     <!-- 
      <Book>abc</Book>
      <Book_Author>Benjamin</Book_author>
     -->
book = Nokogiri::XML::Node.new('book', doc)
pen  = Nokogiri::XML::Node.new('pen', doc)     
.
.

Existe alguma maneira de loop usando "each" em vez de adicionar um por um .. Eu tentei desta forma, mas isso não funciona.

construtor = Nokogiri :: XML :: Builder.with (doc) do | xml |
nós = Nokogiri :: XML :: Node.new (doc, [])
[] .each {| child_list_element |
child_list_element.Book "value" child_list_element.Pen "valor" child_list_element.Diary "valor" child_list_element.Pen_stand "valor" child_list_element.Pencil "valor". . .
}
fim
doc <<





O código pode estar errado, mas eu quero fazer isso. Mais um é como .. posso adicionar todos os elementos como NodeSet em vez de Node. Por favor, corrija meu código.

desde já, obrigado

O OpenStruct aninhado não parece estar funcionando bem. Eu tentei com um exemplo abaixo

Coleção de catálogos de loja
require 'ostruct'
require 'nokogiri'

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',
    :productId => 'CRSUS113246A',
    :productCategory => 'Crime And Suspense',
    :productSubcategory => 'Vintage Books',  
    :productPrice => '45.50 USD',
    :productAuthor => OpenStruct.new(
            :authorFirstName =>'John Grisham',
    :authorMiddleName=> 'Willburt',
    :authorContact => '19876648981')),
:catalogProductInfo => OpenStruct.new(
    :productType => 'Pen',
    :productName => 'Reynolds',
    :productId => 'PRREY546647',
    :productCategory => 'Misc. Stationary',
    :productSubcategory => 'Stationery Items',  
    :productPrice => '3.00 USD',
    :productManufacturer => 'Reynolds Inc.',
    :productAuthor => OpenStruct.new(
        :authorFirstName => 'Ryan Reynolds',
    :authorMiddleName => 'William',
    :authorContact => '16577589898')),
:catalogListType => 'ProductCollection',
:catalogListSource => 'Web'
),
:catalogVerificaitionLog => OpenStruct.new(
    :catalogVerificationStatus => 'Verified',
:catalogVerificationDateTime => '2012-03-12T13:00:15+5:30',
:catalogVerificationId => '64774A',
:catalogVerificationRequestedBy => 'user_121')
)]

Eu quero acessar o "productType" do primeiro "catalogProductInfo" e eu disse "collection.catalogList.catalogProductInfo.producttype.content" e recebo o erro abaixo

"método indefinido` productType 'para # (NoMethodError)

O OpenStruct tem o suporte para o OpenStruct Aninhado? Eu quero construir um XML no formato abaixo usando o OpenStruct e o Nokogiri?

<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>                          
        <ProductId>CRSUS113246A</ProductId>
        <ProductCategory>Crime And Suspense</ProductCategory>
        <ProductSubCategory>Vintage Books</ProductSubCategory>
        <ProductPrice>45.50 USD</ProductPrice>
        <ProductAuthor>
            <AuthorFirstName>John Grisham</AuthorFirstName>
        <AuthorMiddleName>Willbur</AuthorMiddleName>
        <AuthorContact>19876648981</AuthorContact>
        </ProductAuthor>
    </CatalogProductInfo>
    <CatalogProductInfo>
        <ProductType>Pen</ProductType>
        <ProductName>Reynolds</ProductName>                        
        <ProductId>PRREY546647</ProductId>
        <ProductCategory>Misc. Stationary</ProductCategory>
        <ProductSubCategory>Stationary Items</ProductSubCategory>
        <ProductPrice>3.00 USD</ProductPrice>
        <ProductAuthor>
        <AuthorFirstName>Ryan Reynolds</AuthorFirstName>
        <AuthorMiddleName>William</AuthorMiddleName>
        <AuthorContact>16577589898</AuthorContact>
        </ProductAuthor>
    </CatalogProductInfo>
    <CatalogListType>ProductCollection</CatalogListType>
    <CatalogListSource>Web</CatalogListSource>
</CatalogList>
<CatalogVerificationLog>
    <CatalogVerificationStatus>Verified</CatalogVerificationStatus>
    <CatalogVerificationDateTime>2012-03-12T13:00:15+5:30</CatalogVerificationDateTime>
    <CatalogVerificationId>64774A</CatalogVerificationId>
    <CatalogVerificationRequestedBy>User_121</CatalogVerificationRequestedBy>
</CatalogVerificationLog>

Eu quero conseguir isso usando o Nokogiri e o OpenStruct, mas não tenho certeza se isso é possível com o OpenStruct, já que ele não possui recursos de aninhamento. Existe alguma outra maneira de usar o JSon para conseguir isso sem quaisquer limitações pendentes? Por favor, corrija meu código anterior.