2012-12-27 18 views
6

Zastanawiam się, czy istnieje funkcja w języku Ruby, taka jak is_xml?(string), aby określić, czy dany ciąg ma format XML.Sprawdź, czy ciąg znaków jest sformatowany w formacie XML.

+0

Czy chcesz rozróżnić kod XML i poprawnie uformowany kod HTML? –

+0

Cześć Tin Man, odpowiedź brzmi: nie. Mam kilka wspólnych ciągów i wymieszane ze sobą ciągi w formacie XML. Chcę je podzielić. – mCY

Odpowiedz

16

Nokogiri na parse używa prostego testu regex szuka <html> w próbie ustalenia, czy dane, które mają być analizowane jest HTML lub XML:

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

Coś podobnego, szukając deklaracji XML będzie punktem wyjścia:

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

Jeśli zwraca coś innego niż nil, ciąg zawiera deklarację XML. Ważne jest, aby to przetestować, ponieważ pusty łańcuch zmyli kolejne kroki.

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

Nokogiri posiada także metodę errors, która będzie zwracać tablicę błędów po próbie analizowania dokumentu, który jest uszkodzony. Testowanie, które dla dowolnej wielkości pomogłoby:

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 

byłaby prawdą, jeśli dokument jest poprawny pod względem składniowym.


właśnie testowane Nokogiri aby sprawdzić, czy to może odróżnić regularny ciąg vs. prawda XML:

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

Tak, można pętli plików i sortować je do XML i zakaz -XML łatwo:

require 'nokogiri' 

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

Przypisywanie wynik group_by do zmiennej, a będziesz mieć hash można sprawdzić za nieprzestrzeganie XML (false) lub XML (true).

+0

Świetnie! Szczegóły są naprawdę pomocne. – mCY

+0

Dodałem nieco więcej kodu, który może ci się przydać. –

1

Nie ma takiej funkcji w klasie String Ruby lub rozszerzeń Smyczkowych aktywne wsparcie, ale można użyć Nokogiri do 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

To nam niewiele mówi: 'Nokogiri :: XML ('') {| config | config.strict} => # '. Pusty łańcuch nie jest XML, ani nie jest poprawnie lub niepoprawnie sformatowany. 'Nokogiri :: XML (''). Errors' powie Ci, czy są błędy, ale jaśniej. –

+0

@ TinMan w prawo, link ma również przykład użycia .errors. 'puts bad_doc.errors' – nurettin

+0

Dzięki za odpowiedź. Teraz wiem, co robić ~ – mCY

Powiązane problemy