0

このxmlをハッシュに解析しようとしています。私は Hash.from_xml を使用していますが、要素に値があり、他の要素が子である場合を処理できないようです。値のみを取得し、子は取得しません。

<?xml version="1.0" encoding="UTF-8"?>
<StatusResponse>
    <AccountID>123</AccountID>
    <ErrorMsg />
    <Test>Y</Test>
    <StatusList>
        <PICNumber>
            9477707123456123456781
            <Status>Youritemwasdeliveredat10:09AMon08/06/2007inPALOALTOCA94301.</Status>
            <StatusBreakdown>
                <Status_1>ArrivalatPostOfficeJune02201110:11amNORTHHOLLYWOODCA91605</Status_1>
                <Status_2>ForwardExpiredJune0220116:59amNORTHHOLLYWOODCA</Status_2>
                <Status_3>ProcessedthroughSortFacilityJune0120114:53pmBELLGARDENSCA90201</Status_3>
                <Status_4>ElectronicShippingInfoReceivedMay312011</Status_4>
                <Status_5>ShipmentAcceptedMay3120114:25pmPALOALTOCA94303</Status_5>
            </StatusBreakdown>
            <StatusCode>D</StatusCode>
       </PICNumber>
    </StatusList>
</StatusResponse>

値 9477707123456123456781 は PicNumber キーに正しく解析されますが、それより下の他のすべてはスキップされます。

4

2 に答える 2

2

走る前に、まずは散歩。必要な値を取得してから、ハッシュを作成します。

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="UTF-8"?>
<StatusResponse>
    <AccountID>123</AccountID>
    <ErrorMsg />
    <Test>Y</Test>
    <StatusList>
        <PICNumber>
            9477707123456123456781
            <Status>Youritemwasdeliveredat10:09AMon08/06/2007inPALOALTOCA94301.</Status>
            <StatusBreakdown>
                <Status_1>ArrivalatPostOfficeJune02201110:11amNORTHHOLLYWOODCA91605</Status_1>
                <Status_2>ForwardExpiredJune0220116:59amNORTHHOLLYWOODCA</Status_2>
                <Status_3>ProcessedthroughSortFacilityJune0120114:53pmBELLGARDENSCA90201</Status_3>
                <Status_4>ElectronicShippingInfoReceivedMay312011</Status_4>
                <Status_5>ShipmentAcceptedMay3120114:25pmPALOALTOCA94303</Status_5>
            </StatusBreakdown>
            <StatusCode>D</StatusCode>
      </PICNumber>
    </StatusList>
</StatusResponse>
EOT

account_id = doc.at('AccountID').text

pic = doc.at('StatusList PICNumber')
pic_number = pic.child.text.strip
status_msg = pic.at('Status').text

status_breakdown_statuses = pic.search('StatusBreakdown *').map { |n|
  n.text
}

status_code = pic.at('StatusCode').text

hash = {
  :account_id  => account_id,
  :pic_num     => pic_number,
  :status_msg  => status_msg,
  :statuses    => status_breakdown_statuses,
  :status_code => status_code
}

IRB では次のようになります。

{
     :account_id => "123",
        :pic_num => "9477707123456123456781",
       :status_m => "Youritemwasdeliveredat10:09AMon08/06/2007inPALOALTOCA94301.",
       :statuses => [
        [0] "ArrivalatPostOfficeJune02201110:11amNORTHHOLLYWOODCA91605",
        [1] "ForwardExpiredJune0220116:59amNORTHHOLLYWOODCA",
        [2] "ProcessedthroughSortFacilityJune0120114:53pmBELLGARDENSCA90201",
        [3] "ElectronicShippingInfoReceivedMay312011",
        [4] "ShipmentAcceptedMay3120114:25pmPALOALTOCA94303"
    ],
    :status_code => "D"
}

あなたが望むものは明確ではないので、これは XML のセクションを取得するためのコード例です。受け取った XML と私のニーズによっては、別の方法で行う場合があります。

于 2013-03-11T18:58:11.560 に答える
1

ノコギリジェムを使用。read me は非常に簡単です。

于 2013-03-11T17:32:59.957 に答える