2014-06-11 6 views
1

속성은 src 속성이 노코 기리에서 신성한 것 같습니다 (또는 libxml2를?) :방지 노코 기리 그래서

> Nokogiri::HTML.fragment('<foo src="{{bar}}"></foo>').to_html 
=> "<foo src=\"%7B%7Bbar%7D%7D\"></foo>" 

적어도에 대한 (이 속성을 URL 인코딩을 피하기 위해 어떤 방법이 있나요 사용자 정의 요소)? to_xml은 옵션이 아닙니다 (XHTML 환경을 안전하게 보장 할 수 없습니다).

+0

당신은 운이 좋지 않을 것 같아요. [libxml 특수한 경우에 속성을 선택하면 항상 URI가 이스케이프됩니다.] (https://git.gnome.org/browse/libxml2/tree/HTMLtree.c?id = v2.9.1 # n714) 그리고 볼 수있는 한 (libxml의 커스텀 버전을 만들지 못하는) 그것을 무시하는 방법은 없습니다. – matt

답변

1

당신은 Nokogiri가해서는 안되는 일을 기대한다고 생각합니다. <foo>이 알려진 HTML 태그 아니므로

<foo src="{{bar}}"></foo> 

은 HTML이 아니다. 반면에 이 유효한 XML 태그가 될 수 있습니다.

require 'nokogiri' 
doc = Nokogiri::HTML.fragment('<a src="{{bar}}"></a>') 
# => #(DocumentFragment:0x3fe6d6897ba8 { 
#  name = "#document-fragment", 
#  children = [ 
#  #(Element:0x3fe6d6897900 { 
#   name = "a", 
#   attributes = [ 
#   #(Attr:0x3fe6d68978d8 { name = "src", value = "{{bar}}" })] 
#   })] 
#  }) 
doc.to_s 
# => "<a src=\"%7B%7Bbar%7D%7D\"></a>" 

그리고 그것은 XML로 올바르게 처리됩니다하면 어떻게됩니까 :

doc = Nokogiri::XML.fragment('<a src="{{bar}}"></a>') 
# => #(DocumentFragment:0x3fe6d68930d0 { 
#  name = "#document-fragment", 
#  children = [ 
#  #(Element:0x3fe6d6892eb4 { 
#   name = "a", 
#   attributes = [ 
#   #(Attr:0x3fe6d6892e8c { name = "src", value = "{{bar}}" })] 
#   })] 
#  }) 
doc.to_s 
# => "<a src=\"{{bar}}\"/>" 
doc.to_xml 
# => "<a src=\"{{bar}}\"/>" 
doc.to_html 
# => "<a src=\"%7B%7Bbar%7D%7D\"></a>" 

노코 기리가 세트가 노코 기리 당신의 조각으로 무엇을 살펴보면

, 여기에 HTML로 함께 발생하는 상황 HTML을 구문 분석 할 때 사용하는 규칙이지만 기본적으로 HTML DOM을 내부적으로 XML DOM으로 변환합니다.이 구문은 HTML로 파싱 한 후 문서 검사를 볼 때 표시됩니다. 문서가 출력되는 동안 변환이 발생합니다. 너는을 사용하여 Nokogiri를 조금씩 움직여서 원하는 결과물을 출력 할 수 있습니다.

이것이 Nokogiri의 부적절한 행동이라고 생각되면 관리자에게 버그 신고서를 작성하는 것이 좋습니다. 때로는 질문에 답하기 위해 여기로 들르지 만, Nokogiri 토크 메일 목록이나 git 허브 페이지에서 더 빠른 응답을 얻습니다.

유효한 마크 업이 아닌 마크 업을 사용하는 경우 Nokogiri는 유효한 HTML 외관을 강요하려고합니다. 그 시점에서 합리적인 XML, XHTML 또는 HTML을 얻을 수 있어야합니다. "합리적인"은 그것이 의미 론적으로 유효 할 것이라는 것을 의미하며, 정확히 원하는 것은 아닙니다.