2011-12-24 7 views
4

私はNokigiriやRubyを使用して、このように、タグに埋め込まれたタグを持つXMLを解析しようとしています。この場合解析エンコード鋸山を使ってRubyのXML文書内のタグや正規表現

<seg>Trennmesser <ph>&lt;I.FIGREF ITEM=&quot;3&quot; FORMAT=&quot;PARENTHESIS&quot;&gt;</ph><bpt i="1">&lt;I.FIGTARGET TARGET=&quot;CIADDAJA&quot;&gt;</bpt><ept i="1">&lt;/I.FIGREF&gt;</ept></seg> 

を私は言葉が必要になります埋め込まれたタグの中に「トレンネット」はありません。

この第二の例では:

<seg>Hilfsmittel <ph>&lt;[email protected]@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen Beschleunigerwalze <ph>&lt;[email protected]@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg> 

閉じ/phとオープンphタグ内の単語も興味深いものですので、正規表現は「Hilfsmittel 0,5mm zwischen Beschleunigerwalze und Trennmesser schieben.」の文字列を抽出する必要があり、他のすべてを破棄します。私はここで、文書の一部をもアップロードした


http://pastebin.com/Q8CdnASz

答えて

1

が、これは

=> "Hilfsmittel X = 0,5mm zwischen Beschleunigerwalze D und Trennmesser schieben." 

ここでの考え方は、我々で出力私のためにIRB

require 'nokogiri' 
x = Nokogiri::XML.parse('<seg>Hilfsmittel <ph>&lt;[email protected]@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen Beschleunigerwalze <ph>&lt;[email protected]@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg>') 
x.xpath('//seg').children.reject {|x| x.element?}.join {|x| x.content} 

でこれを試してみてください<seg>タグの子を反復し、要素そのものを拒否する(<ph>)、コンテンツ要素のみを残す必要があります。結果の配列を取得し、コンテンツ要素を1つの文字列として結合します。

2つのタグの間にDXが追加されているため、出力が説明したものと若干異なることに注意してください。

1

<ph>タグ内のコンテンツは、予約文字<および>を保存するようにエンコードされています。

これに対処するためのクリーンな方法は、鋸山はXMLに戻って、これらのチャンクを再解析できるようにすることです:

鋸山を示す、以下のノードを出力
require 'nokogiri' 

doc = Nokogiri::XML('<seg>Trennmesser <ph>&lt;I.FIGREF ITEM=&quot;3&quot; FORMAT=&quot;PARENTHESIS&quot;&gt;</ph><bpt i="1">&lt;I.FIGTARGET TARGET=&quot;CIADDAJA&quot;&gt;</bpt><ept i="1">&lt;/I.FIGREF&gt;</ept></seg>') 

ph = Nokogiri::XML::DocumentFragment.parse(doc.at('seg ph').content) 
puts ph.to_xml 

が再作成その正確フラグメント:

<I.FIGREF ITEM="3" FORMAT="PARENTHESIS"/> 

のために<seg>タグ内のテキストを抽出する:

doc.at('//seg/text()').text 
=> "Trennmesser " 

HTMLやXMLを扱う際には、正規表現が何かを抽出する最良の方法であることを前提とすることは決してうまくありません。 HTMLとXMLの両方があまりにも不規則で柔軟性があります(柔軟性とは、刺激的に不正確になるか、まったく独特の予期しない方法で定義されることを意味します)。

require 'nokogiri' 

doc = Nokogiri::XML('<seg>Hilfsmittel <ph>&lt;[email protected]@Lge&gt;</ph>X <ph>&lt;F0&gt;</ph>= 0,5mm zwischen Beschleunigerwalze <ph>&lt;[email protected]@Lge&gt;</ph>D<ph>&lt;F0&gt;</ph> und Trennmesser schieben.</seg>') 

seg = Nokogiri::XML::DocumentFragment.parse(doc.at('seg').content) 
puts seg.content 

出力:

Hilfsmittel @[email protected]>X = 0,5mm zwischen Beschleunigerwalze @[email protected]>D und Trennmesser schieben. 

は、2番目の質問で <seg>タグ内のフルコンテンツを取得するには
関連する問題