Jak dodać węzły potomne w NodeSet za pomocą Nokogiri

Próbuję dodać węzły potomne pod węzłem głównym. Wypróbowałem poniżej xml, ale to nie działa. Jestem nowicjuszem w Ruby i 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>

Muszę dodać węzły poniżej tego węzła głównego

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

To działa dobrze dla mnie .. ale tym, czego dokładnie potrzebuję, jest dodanie tych węzłów po określonej pozycji w dokumencie.

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

spróbowałem tego z at_xpath ('// Catlog'), ale dodaje się na końcu elementu (jak powiedziałeś)

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

Czy mimo to chcesz użyć pętli „każdy” zamiast dodawać jeden po drugim… Próbowałem w ten sposób, ale to nie działa.

builder = Nokogiri :: XML :: Builder.with (doc) do | xml |
nodes = Nokogiri :: XML :: Node.new (doc, [])
[] .each {| child_list_element |
child_list_element.Book "wartość" child_list_element.Pen "wartość" child_list_element.Diary "wartość" child_list_element.Pen_stand "wartość" child_list_element.Pencil "wartość". . .
}
koniec
doc << węzły

Kod może być błędny, ale chcę to zrobić w ten sposób. Jeszcze jedno to jest ... czy mogę dodać wszystkie elementy jako NodeSet zamiast Node. Popraw mój kod.

z góry dziękuję

Nested OpenStruct nie działa poprawnie. Próbowałem z poniższym przykładem

Kolekcja katalogowa sklepu
<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>

chcę uzyskać dostęp do „productType” pierwszego „catalogProductInfo” i powiedziałem „collection.catalogList.catalogProductInfo.productType.content” i otrzymuję poniższy błąd

„niezdefiniowana metoda` productType ”dla # (NoMethodError)

Czy OpenStruct ma wsparcie dla Nested OpenStruct I Chcesz skonstruować XML w poniższym formacie za pomocą OpenStruct i 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>

Chcę to osiągnąć za pomocą Nokogiri i OpenStruct, ale nie jestem pewien, czy jest to możliwe dzięki OpenStruct, ponieważ brakuje mu możliwości zagnieżdżania. Czy jest jakiś inny sposób wykorzystania JSon do osiągnięcia tego bez żadnych wyjątkowych ograniczeń? Popraw mój wcześniejszy kod.

questionAnswers(1)

yourAnswerToTheQuestion