Cómo agregar nodos secundarios en NodeSet usando Nokogiri

Estoy tratando de agregar nodos secundarios a un nodo raíz. Lo probé con un xml inferior, pero esto no funciona. Soy novato de Ruby y Nokogiri.

<code>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  
</code>

Necesito agregar nodos debajo de un nodo raíz como este

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

Eso funciona bien para mí ... pero lo que necesito exactamente es agregar estos Nodos después de una posición específica en el documento.

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

Lo probé con at_xpath ('// Catlog') pero está agregando al final del elemento (como dijiste)

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

¿Hay alguna forma de hacer un bucle usando "cada uno" en lugar de agregar uno por uno? Lo intenté de esta manera pero eso no funciona.

constructor = Nokogiri :: XML :: Builder.with (doc) do | xml |
nodos = Nokogiri :: XML :: Node.new (doc, [])
[]. cada {| child_list_element |
child_list_element.Book "value" child_list_element.Pen "value" child_list_element.Diary "value" child_list_element.Pen_stand "value" child_list_element.Pencil "value". . .
}
fin
doc << nodos

El código puede estar equivocado, pero quiero hacerlo de esta manera. Una más es como ... puedo agregar todos los elementos como NodeSet en lugar de Node. Por favor corrija mi código.

gracias por adelantado

OpenStruct anidado no parece estar funcionando bien. Probé con un ejemplo a continuación.

Colección de catálogo de tienda
<code>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')
)]
</code>

Quiero acceder al "productType" del primer "catalogProductInfo" y dije "collection.catalogList.catalogProductInfo.productType.content" y me aparece el siguiente error

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

¿Tiene OpenStruct el soporte para OpenStruct anidado que quiero construir un XML en el siguiente formato utilizando OpenStruct y Nokogiri?

<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>                          
        <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>
</code>

Quiero lograr esto utilizando Nokogiri y OpenStruct, pero no estoy seguro de si es posible con OpenStruct, ya que carece de capacidades de anidamiento. ¿Hay alguna otra manera de usar JSon para lograr esto sin limitaciones sobresalientes? Por favor corrija mi código anterior.

Respuestas a la pregunta(1)

Su respuesta a la pregunta