1

NokogiriとRuby1.9.2を使用してXMLファイルを解析しています。Descriptions(下記)を読むまで、すべてが正常に機能しているようです。テキストは切り捨てられています。入力テキストは次のとおりです。

<Value>The Copthorne Aberdeen enjoys a location proximate to several bars, restaurants and other diversions. This Aberdeen hotel is located on the city’s West End, roughly a mile from the many opportunities to engage in sightseeing or simply shopping the day away. The Aberdeen International Airport is approximately 10 miles from the Copthorne Hotel in Aberdeen.

There are 89 rooms in total at the Copthorne Aberdeen Hotel. Each of the is provided with direct-dial telephone service, trouser presses, coffee and tea makers and a private bath with a bathrobe and toiletries courtesy of the hotel. The rooms are light in color.

The Hotel Copthorne Aberdeen offers its guests a restaurant where they can enjoy their meals in a somewhat formal setting. For something more laid-back, guests may have a drink and a light meal in the hotel bar. This hotel does offer business services and there are rooms for meetings located onsite. The hotel also provides a secure parking facility for those who arrive by private car.</Value>

しかし、代わりに私は得ています:

g. For something more laid-back, guests may have a drink and a light meal in the hotel bar. This hotel does offer business services and there are rooms for meetings located onsite. The hotel also provides a secure parking facility for those who arrive by private car.

g.それが半分以上を残しているところから始まることに注意してください。

完全なXMLファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Hotel>
  <HotelID>1040900</HotelID>
  <HotelFileName>Copthorne_Hotel_Aberdeen</HotelFileName>
  <HotelName>Copthorne Hotel Aberdeen</HotelName>
  <CityID>10</CityID>
  <CityFileName>Aberdeen</CityFileName>
  <CityName>Aberdeen</CityName>
  <CountryCode>GB</CountryCode>
  <CountryFileName>United_Kingdom</CountryFileName>
  <CountryName>United Kingdom</CountryName>
  <StarRating>4</StarRating>
  <Latitude>57.146068572998</Latitude>
  <Longitude>-2.111680030823</Longitude>
  <Popularity>1</Popularity>
  <Address>122 Huntly Street</Address>
  <CurrencyCode>GBP</CurrencyCode>
  <LowRate>36.8354</LowRate>
  <Facilities>1|2|3|5|6|8|10|11|15|17|18|19|20|22|27|29|30|34|36|39|40|41|43|45|47|49|51|53|55|56|60|62|140|154|209</Facilities>
  <NumberOfReviews>239</NumberOfReviews>
  <OverallRating>3.95</OverallRating>
  <CleanlinessRating>3.98</CleanlinessRating>
  <ServiceRating>3.98</ServiceRating>
  <FacilitiesRating>3.83</FacilitiesRating>
  <LocationRating>4.06</LocationRating>
  <DiningRating>3.93</DiningRating>
  <RoomsRating>3.68</RoomsRating>
  <PropertyType>0</PropertyType>
  <ChainID>92</ChainID>
  <Checkin>14</Checkin>
  <Checkout>12</Checkout>
  <Images>
    <Image>19305754</Image>
    <Image>19305755</Image>
    <Image>19305756</Image>
    <Image>19305757</Image>
    <Image>19305758</Image>
    <Image>19305759</Image>
    <Image>19305760</Image>
    <Image>19305761</Image>
    <Image>19305762</Image>
    <Image>19305763</Image>
    <Image>19305764</Image>
    <Image>19305765</Image>
    <Image>19305766</Image>
    <Image>19305767</Image>
    <Image>37102984</Image>
  </Images>
  <Descriptions>
    <Description>
      <Name>General Description</Name>
      <Value>The Copthorne Aberdeen enjoys a location proximate to several bars, restaurants and other diversions. This Aberdeen hotel is located on the city’s West End, roughly a mile from the many opportunities to engage in sightseeing or simply shopping the day away. The Aberdeen International Airport is approximately 10 miles from the Copthorne Hotel in Aberdeen.

There are 89 rooms in total at the Copthorne Aberdeen Hotel. Each of the is provided with direct-dial telephone service, trouser presses, coffee and tea makers and a private bath with a bathrobe and toiletries courtesy of the hotel. The rooms are light in color.

The Hotel Copthorne Aberdeen offers its guests a restaurant where they can enjoy their meals in a somewhat formal setting. For something more laid-back, guests may have a drink and a light meal in the hotel bar. This hotel does offer business services and there are rooms for meetings located onsite. The hotel also provides a secure parking facility for those who arrive by private car.</Value>
    </Description>
    <Description>
      <Name>LocationDescription</Name>
      <Value>Aberdeen's premier four star hotel located in the city centre just off Union Street and the main business and entertainment areas. Within 10 minutes journey of Aberdeen Railway Station and only 10-20 minutes journey from International Airport.</Value>
    </Description>
  </Descriptions>
</Hotel>

そして、これが私のRubyプログラムです。

require 'rubygems'
require 'nokogiri'
require 'ap'
include Nokogiri

class Hotel < Nokogiri::XML::SAX::Document

    def initialize
        @h = {}
        @h["Images"] = Array.new([])
        @h["Descriptions"] = Array.new([])
        @desc = {}
    end

    def end_document
      ap @h
        puts "Finished..."
    end

    def start_element(element, attributes = [])
        @element = element

    @desc = {} if element == "Description"
    end

    def end_element(element, attributes = [])     
      @h["Images"] << @characters if element == "Image"
    @desc["Name"] = @characters if element == "Name"
    if element == "Value"
      @desc["Value"] = @characters
      @h["Descriptions"] << @desc
    end

    @h[element] = @characters unless %w(Images Image Descriptions Description Hotel Name Value).include? element
    end

    def characters(string)
        @characters = string
    end  
end

# Create a new parser
parser = Nokogiri::XML::SAX::Parser.new(Hotel.new)

# Feed the parser some XML
parser.parse(File.open("/Users/cbmeeks/Projects/shared/data/text/HotelDatabase_EN/00/1040900.xml", 'rb'))

ありがとう

4

2 に答える 2

0

問題のために不要なノードがたくさんあったので、XMLを削除しました。これが私がテキストを追いかける方法のサンプルです:

#!/usr/bin/env ruby
# encoding: UTF-8

xml =<<EOT
<?xml version="1.0" encoding="utf-8"?>
<Hotel>
  <Descriptions>
    <Description>
      <Name>General Description</Name>
      <Value>The Copthorne Aberdeen enjoys a location proximate to several bars, restaurants and other diversions. This Aberdeen hotel is located on the city’s West End, roughly a mile from the many opportunities to engage in sightseeing or simply shopping the day away. The Aberdeen International Airport is approximately 10 miles from the Copthorne Hotel in Aberdeen.

There are 89 rooms in total at the Copthorne Aberdeen Hotel. Each of the is provided with direct-dial telephone service, trouser presses, coffee and tea makers and a private bath with a bathrobe and toiletries courtesy of the hotel. The rooms are light in color.

The Hotel Copthorne Aberdeen offers its guests a restaurant where they can enjoy their meals in a somewhat formal setting. For something more laid-back, guests may have a drink and a light meal in the hotel bar. This hotel does offer business services and there are rooms for meetings located onsite. The hotel also provides a secure parking facility for those who arrive by private car.</Value>
    </Description>
    <Description>
      <Name>LocationDescription</Name>
      <Value>Aberdeen's premier four star hotel located in the city centre just off Union Street and the main business and entertainment areas. Within 10 minutes journey of Aberdeen Railway Station and only 10-20 minutes journey from International Airport.</Value>
    </Description>
  </Descriptions>
</Hotel>
EOT

require 'nokogiri'

doc = Nokogiri::XML(xml)
puts doc.search('Value').map{ |n| n.text }

出力のサンプルを使用して:

コプソーンアバディーンは、いくつかのバー、レストラン、その他の娯楽施設に近い場所にあります。このアバディーンのホテルは、街のウエストエンドに位置し、観光やショッピングを楽しむ多くの機会から約1.6 km(1マイル)の場所にあります。アバディーン国際空港は、アバディーンのコプソーンホテルから約16kmです。

コプソーンアバディーンホテルには全部で89室の客室があります。直通電話サービス、ズボンプレス、コーヒー・ティーメーカー、ホテルの厚意によりバスローブとバスアメニティ付きの専用バスルームが備わっています。部屋は明るい色です。

Hotel Copthorne Aberdeenは、ややフォーマルな雰囲気の中で食事を楽しめるレストランをゲストに提供しています。もっとのんびりしたい場合は、ホテルのバーでドリンクと軽食をお楽しみください。このホテルはビジネスサービスを提供しており、敷地内に会議用の部屋があります。ホテルには、自家用車でお越しの方のための安全な駐車場もあります。ユニオンストリートと主要なビジネスおよびエンターテイメントエリアのすぐそばの市内中心部に位置するアバディーンの最高の4つ星ホテル。アバディーン駅から10分以内、国際空港からわずか10〜20分。

これは意図的にValueノードを追跡するだけです。サンプルを変更して画像ノードも取得するのは簡単です。

さて、いくつか質問があります:なぜSAXモードを使用するのですか?着信XMLは、ホストのRAMに合理的に収まるよりも大きいですか?そうでない場合は、はるかに使いやすいDOMを使用してください。

初めて実行したとき、Rubyは私に言ったinvalid multibyte char (US-ASCII)、つまりXMLに気に入らないことがあるということだ。行を追加して修正しました# encoding。私はRuby1.9.2を使用しています。これにより、このような処理が簡単になります。

検索にCSSアクセサーを使用しています。NokogiriはXPathとCSSを許可しているので、XML解析の心の欲求を自由に楽しむことができます。

于 2011-04-07T00:44:12.203 に答える
0

私は同様の問題に遭遇しました、そしてここに実際の説明があります:

def characters(string)
    @characters = string
end

実際には次のようになります。

def start_element(element, attributes = [])     
  #...(other stuff)...

  # Reset/initialize @characters
  @characters = ""
end

def characters(string)
    @characters += string
end

理論的根拠は、ここで説明されているように、タグのコンテンツが実際には複数のテキストノードに分割される可能性があるということです。http://nokogiri.org/Nokogiri/XML/SAX/Document.html

このメソッドは、1つの連続した文字列が与えられた場合に複数回呼び出される可能性があります。

テキストノードに遭遇するたびに(つまり、charactersメソッドが呼び出される) 、テキストノード@charactersに追加する代わりにコンテンツを置き換えたため、テキスト本文の最後のセグメントのみがキャプチャされていました。

于 2011-09-09T21:32:16.993 に答える