2011-03-10 4 views
0

나는 루비, 이런 식으로 뭔가있는 XML 웹 서비스에서 일부 데이터를 읽고있다 : 나는 XML을 구문 분석 및 구문의 배열을 잡는거야Ruby에서 XML 문자 엔티티 참조를 어떻게 렌더링 할 수 있습니까?

<phrases> 
    <phrase language="en_US">&iexcl;I&#39;m highly&nbsp;annoyed with character references!</phrase> 
</phrases> 

. 보시다시피 text 구에는 XML character entity references이 포함되어 있습니다. 내가 참조하고 실제 문자로 그들을 대체하고 싶습니다. 이것은 숫자 참조로는 간단하지만 XML과 HTML로는 불쾌합니다. 각 XML 또는 HTML 문자 참조의 문자를 포함하는 큰 코드가있는 것을 피하고 싶습니다. 즉 http://www.java2s.com/Code/Java/XML/Resolvesanentityreferenceorcharacterreferencetoitsvalue.htm

확실히 라이브러리가 있습니다. 맞습니까?

업데이트

예, 라이브러리가 거기있다, 그것은 HTMLEntities라고 : 그것은 처리하지 않습니다하지만

: [email protected]; sudo gem install htmlentities 
Successfully installed htmlentities-4.2.4 
: [email protected]; irb 
irb(main):001:0> require 'htmlentities' 
=> [] 
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!" 
=> "¡I'm highly annoyed with character references!" 
+0

'>'및 '<'은 무엇입니까? _all_ 엔티티를 대체하면 잘 구성된 XML이 손상 될 수 있습니다. –

+0

매트, 내가 다루는 데이터는 이미 XML로 파싱되어있다. 여기서 CDATA를 다루므로 모든 엔티티가 해결되기를 바랍니다. 이 질문을 명확히하기 위해 업데이트하겠습니다. –

+0

데이터 자체에 엔티티가 포함 된 XML 문서가 있습니까? (즉, ASCII 문자열 ' '을 XML로 표현한 것이지만, 비 구분 공백을 XML로 표현한 것은 아닙니다.) – Quentin

답변

1

이 솔루션을 제공하려는 시도하지, 그것은 야생에서 XML을 다루는 내 자신의 경험의 일부를 관련시키는입니다. 처음에는 Perl을 사용했고 나중에 Ruby를 사용했고 경험은 XML 또는 RDF/RSS/Atom 피드를 충분히 가져 가면 쉽게 접할 수 있습니다.

XML CDATA에 인코딩 된 HTML과 인코딩되지 않은 HTML이 자주있는 것으로 나타났습니다. 인코딩 된 HTML은 XML을 생성하기 위해 API 또는 라이브러리를 통해 올바른 방법으로 일을 한 결과 일 수 있습니다. 인코딩되지 않은 HTML은 아마도 태그를 사용하여 HTML을 래핑하는 스크립트를 사용하여 잘못된 XML을 발생시킨 사람 이었지만 어쨌든 그것을 처리해야했습니다.

여러 번 인코딩 된 HTML이 포함 된 XML CDATA도 보았습니다. XML 엔진이 모든 작업을 완료 한 후에도 모든 항목의 인코딩을 취소해야했습니다. 때로는 중급 단계에서 다른 사람이 주석을 추가하거나 다른 문자 세트의 여러 HTML 스트림을 결합하여 인코딩 된 문자열과 함께 UTF8이 아닌 문자를 갑자기 사용하게됩니다. 이유가 무엇이든간에, 그것은 실제로 추악했으며 XML 파싱으로 인해 많은 경고가 깨지거나 방출되었습니다. 나는 이전의 패스가 현재의 디코드 패스와 같은지 확인하기 위해 내용을 디코딩하고 검사해야하고 아무것도 변경되지 않았다면 보석금을 내야한다. 유효한 캐릭터 세트에 문자열을 넣을 수 있다고 보장 할 수는 없으므로 iconv에 UTF8로 변환하고 깔끔하게 변환하지 않는 문자를 버리라고해야합니다.

Nokogiri는 to_xmlto_html 방법을 창의적으로 사용하여 노드의 내용을 다양한 방식으로 디코딩 할 수 있습니다.또한 HTMLEntities gem, Loofah 및 기타 CDATA 내용을 살펴볼 수 있습니다. 수세미는 당신이 만날지도 모르는 화이트리스트/블랙리스트 태그를 위해 설계 되었기 때문에 좋습니다.

XML 사양은 우리를 그러한 헛소리로부터 보호하기로되어 있지만 동료들 중 한 사람이 "우리는 바보 취급 할 수는 있지만 바보가 아닙니다."라고 말하면서 말합니다. 사람들은 독창적이며 사양은 읽지 않으려 고하거나 걱정하지 않는 사람에게 아무런 의미가 없습니다.

+0

[HTMLEntities] (http://htmlentities.rubyforge.org/)에 대한 포인터에 대해 감사드립니다! 내 문제를 어떻게 해결했는지 보여주기 위해 답을 편집하여 제출 했으므로 리뷰를 검토 할 때 문제가 표시되어야합니다. –

+0

@Josh Glover, 내 대답을 수정해서는 안됩니다. 원래 질문을 편집하여 답안을 사용한 방법을 보여줘야합니다. –

2

REXML는 그것을 할 수 있습니다 "& iexcl;" 또는 "& nbsp;" 미리 정의 된 XML 엔터티 목록 (Unicode 숫자 엔터티 제외)은 실제로 매우 작습니다. 당신은 XML과 (예를 들어)과 같은 포함 된 개체 구문 분석 할 수

<phrases> 
    <phrase language="en_US">&quot;I&#39;m highly annoyed with character references!&#x00a9;</phrase> 
</phrases> 

: 분명히

require 'rexml/document' 

doc = REXML::Document.new(File.open('/tmp/foo.xml').readlines.join('')) 
phrase = REXML::XPath.first(doc, '//phrases/phrase') 
text = phrase.first # Type is REXML::Text 
puts(text.value) 

을, 그 예는 XML이 있다고 가정이 입력 XML을 감안할 때 http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

참조 파일 /tmp/foo.xml에 있습니다. XML 문자열을 쉽게 전달할 수 있습니다. 내 Mac 및 우분투 시스템에서 그것을 실행하면 생성합니다

$ ruby /tmp/foo.rb 
"I'm highly annoyed with character references!© 
관련 문제