2009-08-23 2 views
1

좋아요, 작업 속도를 Libxml-ruby로 바꾸려면 _why가 사라지고 속도가 빠르므로 Nokogiri를 잠깐 보았지만 속도와 수명을 위해 Libxml-ruby를 살펴보기로했습니다. 나는 기본적인 뭔가를 놓친하지만 작동하지 않는 일을하려고 메신저, 여기 내 XML 문자열입니다해야합니다 전체 피드에서 약 150 같은 항목이libxml-ruby 구문 분석 도움말

<?xml version="1.0" encoding="utf-8" ?> 
<feed> 
    <title type="xhtml"></title> 
    <entry xmlns="http://www.w3.org/2005/Atom"> 
    <id>urn:publicid:xx.xxx:xxxxxx</id> 
    <title>US--xxx-xxxxx</title> 
    <updated>2009-08-19T15:49:51.103Z</updated> 
    <published>2009-08-19T15:44:48Z</published> 
    <author> 
     <name>XX</name> 
    </author> 
    <rights>blehh</rights> 
    <content type="text/xml"> 
     <nitf> 
     <head> 
      <docdata> 
      <doc-id regsrc="XX" /> 
      <date.issue norm="20090819T154448Z" /> 
      <ed-msg info="Eds:" /> 
      <doc.rights owner="xx" agent="hxx" type="none" /> 
      <doc.copyright holder="xx" year="2009" /> 
      </docdata> 
     </head> 
     <body> 
      <body.head> 
      <hedline> 
       <hl1 id="headline">headline</hl1> 
       <hl2 id="originalHeadline">blah blah</hl2> 
      </hedline> 
      <byline>john doe<byttl>staffer</byttl></byline> 
      <distributor>xyz</distributor> 
      <dateline> 
       <location>foo</location> 
      </dateline> 
      </body.head> 
      <body.content> 
      <block id="Main"> 
       story content here 
      </block> 
      </body.content> 
      <body.end /> 
     </body> 
     </nitf> 
    </content> 
    </entry> 
</feed> 

.

난 그냥 150 항목을 통해 루프를 누른 다음 내용과 특성을 잡아하지만 난 libxml - 루비와 시간이 지옥을 가지고있어 Hpricot와 잘 일했다.

parser = XML::Parser.string(file) 
doc = parser.parse 
entries = doc.find('//entry') 
puts entries.size 
entries.each do |node| 
    puts node.inspect 
end 

어떤 아이디어 :

이 작은 조각

메신저도 항목을받지 못하고 있음을 보여줍니다? 나는 문서를 살펴 보았고 여기서 XML 파일을 찾을 수 없었다. 여기 x, y, z를 가져 오는 샘플이있다. 이것은 아주 간단해야합니다.

답변

1

Nokogiri는 약간의 속도와 수명이있는 것으로 판명되었으므로 샘플 XML의 네임 스페이스를 처리하는 방법에 대한 샘플이 있습니다. 나는 RDF/RSS/Atom 어 그리 게이터가 Nokogiri를 사용하여 하루에 수천 개의 피드를 처리하고 있었고, 백엔드 데이터베이스에 넣기 전에 원하는 필드를 잡기 위해 이와 비슷한 방법으로 매일 피드를 처리했습니다.

require 'nokogiri' 

doc = Nokogiri::XML(file) 
namespace = {'xmlns' => 'http://www.w3.org/2005/Atom'} 

entries = [] 
doc.search('//xmlns:entry', namespace).each do |_entry| 

    entry_hash = {} 

    %w[title updated published author].each do |_attr| 
    entry_hash[_attr.to_sym] = _entry.at('//xmlns:' << _attr, namespace).text.strip 
    end 

    entry_hash[:headlines] = _entry.search('xmlns|hedline > hl1, xmlns|hedline > hl2', namespace).map{ |n| n.text.strip } 
    entry_hash[:body]  = _entry.at('//xmlns:body.content', namespace).text.strip 
    entry_hash[:title]  = _entry.at('//xmlns:title', namespace).text 

    entries << entry_hash 
end 

require 'pp' 
pp entries 
# >> [{:title=>"US--xxx-xxxxx", 
# >> :updated=>"2009-08-19T15:49:51.103Z", 
# >> :published=>"2009-08-19T15:44:48Z", 
# >> :author=>"XX", 
# >> :headlines=>["headline", "blah blah"], 
# >> :body=>"story content here"}] 

Nokogiri의 CSS와 XPath 모두 네임 스페이스를 처리 할 수 ​​있습니다. Nokogiri는 루트 노드에 정의 된 모든 네임 스페이스를 잡아 냄으로써 간단하게 사용할 수 있지만이 XML 샘플에서는 네임 스페이스가 항목 노드에 정의되어 수동으로 처리합니다.

헤드 라인에 대한 CSS 표기법으로 전환했는데이를 수행하는 방법 만 보여주었습니다. 편의상 Nokogiri는 일반적으로 CSS에 대해 와일드 카드 네임 스페이스를 허용합니다 (네임 스페이스 선언을 찾을 수 있다면 의 노드를 hl1 노드로 단순화했을 것입니다).

+0

나는이 스레드로 돌아 가기를 잊었지만, 나는 비슷한 것을했다. – initialized

0

찾기에있는 네임 스페이스를 건너 뛸 때 문제가 발생한 것으로 생각됩니다. xpath documentation for libxml-ruby을 보면 꽤 관련있는 예가 있습니다. 구체적으로 말하자면, find는 아마도 엔트리 = doc.find ('// atom : entry', 'atom : http://www.w3.org/2005/Atom')와 같아야합니다.