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
<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>
Eu preciso adicionar nós abaixo de um nó raiz como este
<code><Catalog> <Book>abc</Book> <Book_Author>Benjamin</Book_author> </code>
Isso funciona bem para mim .. mas o que eu preciso exatamente é adicionar esses nós depois de uma posição específica no documento.
<code><Catalog> <!-- <Book>abc</Book> <Book_Author>Benjamin</Book_author> --> <Interface></Interface> <Dialog></Dialog> <Manifest></Manifest> </Catalog> </code>
Eu tentei com at_xpath ('// Catlog') mas está adicionando no final do elemento (como você disse)
<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>
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<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>
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?
<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>
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.