Как добавить дочерние узлы в NodeSet с помощью Nokogiri

Я пытаюсь добавить дочерние узлы в корневой узел.. Я пробовал использовать приведенный ниже xml, но это не работает. Я новичок в Ruby и 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  

Мне нужно добавить узлы ниже корневого узла, как этот

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

Это работает хорошо для меня.. но мне нужно добавить эти узлы после определенной позиции в документе.

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

я попробовал это с помощью _xpath ('//Catlog' ), но он добавляется в конец элемента (, как вы сказали)

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

Есть ли способ зациклить, используя "каждый "вместо того, чтобы добавлять по одному.. Я пробовал так, но это не работает.

builder = Nokogiri ::XML ::Builder.with (doc )do |xml|
nodes = Nokogiri ::XML ::Node.new (doc, [])
[].each {|child _list _element|
дочерний _список _element.Book "значение" дочерний _список _element.Pen "значение" дочерний _список _element.Diary "значение" дочерний _список _element.Pen _стенд "значение" дочерний _список _element.Pencil "значение"...
}
конец
doc << nodes

Код может быть неправильным, но я хочу сделать так. Еще это похоже на... могу ли я добавить все элементы как NodeSet вместо Node. Пожалуйста, исправьте мой код.

Заранее спасибо


  1. Вложенный OpenStruct не работает нормально.Я попытался использовать приведенный ниже пример

    Коллекция каталогов Store

    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')
    )]
    

Я хочу получить доступ к «productType» первого «catalogProductInfo», и я сказал «коллекция.catalogList.catalogProductInfo.productType.content» и я получаю следующую ошибку

«неопределенный метод `productType» для#(NoMethodError)

Поддерживает ли OpenStruct вложенную OpenStruct. Я хочу построить XML в формате ниже, используя OpenStruct и 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>

Я хочу добиться этого с помощью Nokogiri и OpenStruct, но я не уверен, возможно ли это с OpenStruct, так как в нем отсутствуют возможности вложенности. Есть ли другой способ использовать JSon для достижения этого без каких-либо выдающихся ограничений? Пожалуйста, исправьте мой более ранний код

7
задан ThinkingStiff 20 February 2013 в 20:28
поделиться