2013-06-04 2 views
0

여기서는 mongodb 드라이버를 사용하고 있습니다. 그러나 이것이 완벽하게 작동하면 Mongoid ODB와 함께 Ruby on Rails 3에서 예정된 작업으로 실행하고 싶습니다.균열 gem을 사용하여 단순화 된 XML 파일을 mongodb로 가져 오기

이제는 루비를 실험하고 있습니다.

XML 파일을 mongodb에 삽입 할 수있는 형식으로 변환 할 때 균열 주옥이 매우 편리하다는 것을 알았습니다. 루비 용 mongodb 드라이버를 사용할 때 균열은 JSON에 가까운 형식으로 변환됩니다 (":"대신 "="을 사용합니다). 이는 필자가 here과 같이 mondodb 데이터베이스에 삽입하기 전에 필요한 조건입니다.

내가 아래의 균열을 사용하는 방식의 문제는 XML 파일에있는 모든 것을 가져옵니다. 아래를 참조하십시오.

sample.xml

<?xml version="1.0" encoding="utf-8"?> 
<ShipmentRequest> 
    <Envelope> 
    <TransmissionDateTime>05/08/2013 23:06:02</TransmissionDateTime> 
    </Envelope> 
    <Message> 
    <Comment /> 
    <Header> 
     <MemberId>A00000001</MemberId> 
     <MemberName>Bruce</MemberName> 
     <DeliveryId>6377935</DeliveryId> 
     <ShipToAddress1>123-4567</ShipToAddress1> 
     <OrderDate>05/08/13</OrderDate> 
     <Payments> 
     <PayType>Credit Card</PayType> 
     <Amount>1000</Amount> 
     </Payments> 
     <Payments> 
     <PayType>Points</PayType> 
     <Amount>5390</Amount> 
     </Payments> 
    </Header> 
    <Line> 
     <LineNumber>3.1</LineNumber> 
     <Item>fruit-004</Item> 
     <Description>Peach</Description> 
     <Quantity>1</Quantity> 
     <UnitCost>1610</UnitCost> 
     <DeclaredValue>0</DeclaredValue> 
     <PointValue>13</PointValue> 
    </Line> 
    <Line> 
     <LineNumber>8.1</LineNumber> 
     <Item>fruit-001</Item> 
     <Description>Fruit Set</Description> 
     <Quantity>1</Quantity> 
     <UnitCost>23550</UnitCost> 
     <PointValue>105</PointValue> 
     <PickLine> 
     <PickLineNumber>8.1..1</PickLineNumber> 
     <PickItem>fruit-002</PickItem> 
     <PickDescription>Apple</PickDescription> 
     <PickQuantity>1</PickQuantity> 
     </PickLine> 
     <PickLine> 
     <PickLineNumber>8.1..2</PickLineNumber> 
     <PickItem>fruit-003</PickItem> 
     <PickDescription>Orange</PickDescription> 
     <PickQuantity>2</PickQuantity> 
     </PickLine> 
    </Line> 
    </Message> 
</ShipmentRequest> 

sample_crack.rb는

그것은 콘솔에 인쇄
#!/usr/bin/ruby 

require "crack" 
require 'mongo' 
include Mongo 

mongo_client = MongoClient.new("localhost", 27017) 
db = mongo_client.db("somedb") 
coll = db.collection("somecoll") 

myXML = Crack::XML.parse(File.read("sample.xml")) 
coll.insert(myXML) 

puts myXML 

다음 MongoDB의에서

{"ShipmentRequest"=>{"Envelope"=>{"TransmissionDateTime"=>"05/08/2013 23:06:02"}, "Message"=>{"Comment"=>nil, "Header"=>{"MemberId"=>"A00000001", "MemberName"=>"Bruce", "DeliveryId"=>"6377935", "ShipToAddress1"=>"123-4567", "OrderDate"=>"05/08/13", "Payments"=>[{"PayType"=>"Credit Card", "Amount"=>"1000"}, {"PayType"=>"Points", "Amount"=>"5390"}]}, "Line"=>[{"LineNumber"=>"3.1", "Item"=>"fruit-004", "Description"=>"Peach", "Quantity"=>"1", "UnitCost"=>"1610", "DeclaredValue"=>"0", "PointValue"=>"13"}, {"LineNumber"=>"8.1", "Item"=>"fruit-001", "Description"=>"Fruit Set", "Quantity"=>"1", "UnitCost"=>"23550", "PointValue"=>"105", "PickLine"=>[{"PickLineNumber"=>"8.1..1", "PickItem"=>"fruit-002", "PickDescription"=>"Apple", "PickQuantity"=>"1"}, {"PickLineNumber"=>"8.1..2", "PickItem"=>"fruit-003", "PickDescription"=>"Orange", "PickQuantity"=>"2"}]}]}}, :_id=>BSON::ObjectId('51ad8d83a3d24b3b9f000001')} 

, 변환 된 XML 파일과 같이 보인다 :

{ 
    "_id" : ObjectId("51ad8d83a3d24b3b9f000001"), 
    "ShipmentRequest" : { 
     "Envelope" : { 
      "TransmissionDateTime" : "05/08/2013 23:06:02" 
     }, 
     "Message" : { 
      "Comment" : null, 
      "Header" : { 
       "MemberId" : "A00000001", 
       "MemberName" : "Bruce", 
       "DeliveryId" : "6377935", 
       "ShipToAddress1" : "123-4567", 
       "OrderDate" : "05/08/13", 
       "Payments" : [ 
        { 
         "PayType" : "Credit Card", 
         "Amount" : "1000" 
        }, 
        { 
         "PayType" : "Points", 
         "Amount" : "5390" 
        } 
       ] 
      }, 
      "Line" : [ 
       { 
        "LineNumber" : "3.1", 
        "Item" : "fruit-004", 
        "Description" : "Peach", 
        "Quantity" : "1", 
        "UnitCost" : "1610", 
        "DeclaredValue" : "0", 
        "PointValue" : "13" 
       }, 
       { 
        "LineNumber" : "8.1", 
        "Item" : "fruit-001", 
        "Description" : "Fruit Set", 
        "Quantity" : "1", 
        "UnitCost" : "23550", 
        "PointValue" : "105", 
        "PickLine" : [ 
         { 
          "PickLineNumber" : "8.1..1", 
          "PickItem" : "fruit-002", 
          "PickDescription" : "Apple", 
          "PickQuantity" : "1" 
         }, 
         { 
          "PickLineNumber" : "8.1..2", 
          "PickItem" : "fruit-003", 
          "PickDescription" : "Orange", 
          "PickQuantity" : "2" 
         } 
        ] 
       } 
      ] 
     } 
    } 
} 

하지만 그렇지 필요한 노드를 제거하고 비어있는 무시 좋아 가져올 싶습니다

{ 
    "_id" : ObjectId("51ad8d83a3d24b3b9f000001"), 
    "MemberId" : "A00000001", 
    "MemberName" : "Bruce", 
    "DeliveryId" : "6377935", 
    "ShipToAddress1" : "123-4567", 
    "OrderDate" : "05/08/13", 
    "Payments" : [ 
    { 
     "PayType" : "Credit Card", 
     "Amount" : "1000" 
    }, 
    { 
     "PayType" : "Points", 
     "Amount" : "5390" 
    } 
    ], 
    "Line" : [ 
    { 
     "LineNumber" : "3.1", 
     "Item" : "fruit-004", 
     "Description" : "Peach", 
     "Quantity" : "1", 
     "UnitCost" : "1610", 
     "DeclaredValue" : "0", 
     "PointValue" : "13" 
    }, 
    { 
     "LineNumber" : "8.1", 
     "Item" : "fruit-001", 
     "Description" : "Fruit Set", 
     "Quantity" : "1", 
     "UnitCost" : "23550", 
     "PointValue" : "105", 
     "PickLine" : [ 
     { 
      "PickLineNumber" : "8.1..1", 
      "PickItem" : "fruit-002", 
      "PickDescription" : "Apple", 
      "PickQuantity" : "1" 
     }, 
     { 
      "PickLineNumber" : "8.1..2", 
      "PickItem" : "fruit-003", 
      "PickDescription" : "Orange", 
      "PickQuantity" : "2" 
     } 
     ] 
    } 
    ] 
} 

이이 균열 함께 할 수 있습니까? 또는 이것이 노 코기 리로 더 잘할 수 있습니까? @ 알렉스 Peachey에


업데이트

큰 덕분에, 나는 여기 업데이트 된 코드를 삽입.

sample_crack/RB (업데이트) :

#!/usr/bin/ruby 

require "crack" 
require 'mongo' 
include Mongo 

mongo_client = MongoClient.new("localhost", 27017) 
db = mongo_client.db("somedb") 
coll = db.collection("somecoll") 

myXML = Crack::XML.parse(File.read("sample.xml")) 

myXML.merge!(myXML.delete("ShipmentRequest")) # not needed hash 
myXML.merge!(myXML.delete("Message"))   # not needed hash 
myXML.merge!(myXML.delete("Header"))   # not needed hash 
myXML.delete("Envelope")      # not needed hash 

# planning to put here a code to remove hashes with empty values 

coll.insert(myXML) 

puts myXML 

답변

2

그것은 당신이 "-필요하지"노드를 정의하지만, 비어있는 이해할 수있을만큼 쉬운 방법을 말할 어렵다. 어느 쪽이든, 크랙은 기본적으로 XML을 해시 (hash)로 바꾸는 것을 당신에게 해주고 있습니다. 일단 당신이 Mongo에 그것을 삽입하기 전에 가지고있는 규칙에 기초하여 원하는대로 해시를 가지 치기 만하면됩니다.

귀하의 의견에 따르면, 나는 당신이 무엇을 요구하고 있는지 더 잘 이해하고 있습니다. 내 대답은 여전히 ​​사실이며, 단지 해시를 조작하십시오. 특별히 다음과 같이 할 수 있습니다 :

myXML.merge!(myXML.delete("ShipmentRequest")) 
myXML.delete("Envelope") 
myXML.merge!(myXML.delete("Message")) 
+0

내 경우에는 태그 이름을 삽입하고 싶지 않습니다 : ShipmentRequest, Envelope 및 Message. 결과적으로 계층 구조가 그에 따라 변경되어야합니다. – Askar

관련 문제