1

@Jamie によって提供された以前のソリューションは、いくつかのシナリオでのみ正常に機能しているようです。解決策は

require 'nokogiri'
require 'ostruct'

xml = <<-'XML'
<Catalog>
    <Interface></Interface>
        <Dialog></Dialog>
        <Manifest></Manifest>
</Catalog>
XML

collection = [
    OpenStruct.new(book: '1984', pen: 'George Orwell'),
    OpenStruct.new(book: 'Thinking, Fash and Slow', pen: 'Daniel Kahneman')
]

doc = Nokogiri::XML(xml) 
catalog = doc.root

node_set = Nokogiri::XML::NodeSet.new(doc)
collection.each do |object|
    book = Nokogiri::XML::Node.new('Book', doc)
    book_author = Nokogiri::XML::Node.new('Book_Author', doc)

    book.content = object.book
    book_author.content = object.pen

    node_set << book
    node_set << book_author
end

catalog.first_element_child.before(node_set)

puts doc.to_xml    

私は Nokogiri を使用して構築する以下の XML を持っています。これが OpenStruct を使用して実行できないかどうかを知りたかっただけです。これはJsonを使用して行うことができますか? はいの場合、Nokogiri と Json を使用してこれを構築する方法を教えてください。

以下はこのXMLです。構築したい...

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

以下のOpenStruct形式で編成されたデータがあります...

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

ネスティング機能がないため、OpenStruct で可能かどうかはわかりません。顕著な制限なしでこれを達成するために JSON を使用する他の方法はありますか? 以前のコードを修正してください。

この以前の質問を見るには、Nokogiri を使用して NodeSet に子ノードを追加する方法 [ここをクリック] (http://stackoverflow.com/questions/10300095/how-to-add-child-nodes-in-nodeset-using-nokogiri)

OpenStruct に関する以下の問題が表示されます...

最初の「catalogProductInfo」の「productType」にアクセスしたいのですが、「collection.catalogList.catalogProductInfo.productType.content」と言ったところ、以下のエラーが発生しました

"undefined method `productType' for # (NoMethodError)

ここで立ち往生し、この状況なら抜け出したい。OpenStruct を使用してデータを整理できない場合。これはJSONを使用して行うことができますか? ? Nokogiri と JSon の方法も教えてください。手伝ってください。

4

0 に答える 0