OpenStruct是否支持嵌套?如果是,我如何使用Nokogiri构建XML?如果没有,可以使用Nokogiri和JSon完成吗?

时间:2012-06-24 14:15:18

标签: ruby xml json nokogiri openstruct

@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的方法。帮助我。

0 个答案:

没有答案
相关问题