2011-03-16 4 views
1

REXML이 식별 또는 공백 문자를 무시해야합니까?공백을 무시하고 REXML 문서를 구문 분석하십시오.

simple HTML to Markdown convertor으로 문제를 디버깅하고 있습니다. 어떤 이유로 그 첫 번째 경우에, type.children.first.value은 그것이 후자의 경우, 설정되지 않은,

<blockquote><p>foo</p></blockquote> 

하지만

<blockquote> 
    <p>foo</p> 
</blockquote> 

이유는에

에 실패합니다. 원래의 코드는 위의 링크에서 찾을 수 있습니다,하지만이 문제를 보여 냈다 응축 아래입니다 :

require 'rexml/document' 
include REXML 

def parse_string(string) 
    doc = Document.new("<root>\n"+string+"\n</root>") 
    root = doc.root 
    root.elements.each do |element| 
    parse_element(element, :root) 
    end 
end 

def parse_element(element, parent) 
    @output = '' 
    # ... 
    @output << opening(element, parent) 
    #... 
end 

def opening(type, parent) 
    case type.name.to_sym 
    #... 
    when :blockquote 
     # remove leading newline 
     type.children.first.value = "" 
     "> " 
    end 
end 

#Parses just fine 
puts parse_string("<blockquote>\n<p>foo</p>\n</blockquote>") 

# Fails with undefined method `value=' for <p> ... </>:REXML::Element (NoMethodError) 
puts parse_string("<blockquote><p>foo</p></blockquote>") 

꽤 확신이 어떤 REXML을 만드는 매개 변수 whitespacing 필요하고 identation 때문입니다 왜 다른 후자와 다른 첫 번째 XML을 구문 분석하겠습니까?

강제로 REXML을 모두 구문 분석 할 수 있습니까? 아니면 완전히 다른 종류의 버그를보고 있습니까?

+1

문제를 나타내는 코드 샘플을 표시하십시오. 또한 [Nokogiri] (http://nokogiri.org)를 사용해야합니다. XML/HTML 파서 인데요, 빠르게 변화하는 선택이되고 있습니다. –

+0

나는 압축 된 예제를 추가했습니다. 그리고 Nokogiri에 대해서 : 나는 그것도 더 좋아합니다. 하지만이 스크립트는 저의 것이 아니며 다른 XML 라이브러리를 사용하도록 다시 작성하는 대신 간단하게 수정하려고합니다 : – berkes

답변

1

ignore_whitespace_nodes => : all을 Document.new()에 전달해보십시오.

+0

그게 문제를 해결하지는 못합니다. 어디서 문서에': ignore_whitespace_nodes'라고 언급 했습니까? – berkes

+0

나를 위해 일했다 (MRI 2.0.0-p481). –

관련 문제