2012-12-27 3 views
6

루비에 is_xml?(string)과 같은 특정 문자열이 XML 형식인지 식별하는 기능이 있는지 궁금합니다.문자열의 형식이 XML인지 확인합니다.

+0

XML과 올바른 형식의 HTML을 구별하고 싶습니까? –

+0

안녕하세요 틴 맨, 대답은 '아니오'입니다. 일반적인 문자열과 XML 형식의 문자열이 함께 혼합되어 있습니다. 나는 그들을 나누고 싶다. – mCY

답변

16

노코 기리의 parse가 있는지 확인하기위한 시도로 <html>을 찾는 간단한 정규식 테스트를 사용 유사한

string =~ /^s*<[^Hh>]*html/ # Probably html 

뭔가, XML 선언을 찾는 출발점이 될 것입니다 : 구문 분석 할 수있는 데이터는 HTML이나 XML은

,
string = '<?xml version="1.0"?><foo><bar></bar></foo>' 
string.strip[/\A<\?xml/] 
=> "<?xml" 

nil이 아닌 값을 반환하면 문자열에 XML 선언이 포함됩니다. 빈 문자열이 다음 단계를 속일 것이기 때문에 이것을 테스트하는 것이 중요합니다.

Nokogiri::XML('').errors.empty? 
=> true 

노코 기리 또한 조작 된 문서를 구문 분석하도록 시도한 후 오류의 배열을 반환 할 errors 방법이있다. 모든 크기에 대해 테스트하면 다음과 같이 도움이됩니다.

Nokogiri::XML('<foo>').errors 
=> [#<Nokogiri::XML::SyntaxError: Premature end of data in tag foo line 1>] 
Nokogiri::XML('<foo>').errors.empty? 
=> false 

Nokogiri::XML(string).errors.empty? 
=> true 

은 구문 적으로 유효한 문서 일 경우 true입니다.


내가 그냥 일반 문자열 대 사실 XML의 차이 말할 수 있는지 노코 기리 테스트 : 그래서

[2] (pry) main: 0> doc = Nokogiri::XML('foo').errors 
[ 
    [0] #<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found> 
] 

을, 당신은 당신의 파일을 통해 루프는 XML 및 비로 정렬 할 수 있습니다 (를

require 'nokogiri' 

[ 
    '', 
    'foo', 
    '<xml></xml>' 
].group_by{ |s| (s.strip > '') && Nokogiri::XML(s).errors.empty? } 
=> {false=>["", "foo"], true=>["<xml></xml>"]} 

변수에 group_by의 결과를 할당, 당신은 당신이 아닌 XML (false) 또는 XML을 확인할 수 해시를해야합니다 : 쉽게 -xml).

+0

좋아! 세부 사항은 정말 도움이됩니다. – mCY

+0

유용한 코드를 추가했습니다. –

1

가 루비의 String 클래스 또는 Active 지원의 문자열 확장에 그런 기능이 없다,하지만 당신은 detect errors in XML에 노코 기리를 사용할 수 있습니다

begin 
    bad_doc = Nokogiri::XML(badly_formed) { |config| config.strict } 
rescue Nokogiri::XML::SyntaxError => e 
    puts "caught exception: #{e}" 
end 
+0

이것은 우리에게별로 알려주지 않습니다 :'Nokogiri :: XML ('') {| config | config.strict} => # '. 빈 문자열은 XML이 아니며 형식이 잘못되었거나 잘못되었습니다. 'Nokogiri :: XML (''). errors'는 에러가 있는지를 알려주지 만, 더 명확하게 말합니다. –

+0

@ theTinMan 오른쪽 링크에는 .errors 사용법의 예가 있습니다. 'puts bad_doc.errors' – nurettin

+0

답해 주셔서 감사합니다. 이제 어떻게 해야할지 ~ ~ – mCY

관련 문제