2009-08-17 11 views
12

मुझे इस तथ्य की ओर इशारा करते हुए कुछ पोस्ट मिल गई हैं कि आप अपने डीटीडी के खिलाफ नोकोगिरी मणि का उपयोग करके एक्सएचटीएमएल को मान्य कर सकते हैं। जबकि मैंने इसका उपयोग एक्सएचटीएमएल को सफलतापूर्वक पार्स करने के लिए किया है ('ए' टैग आदि की तलाश में), मैं दस्तावेजों को प्रमाणित करने के लिए संघर्ष कर रहा हूं।मैं एक्सएचटीएमएल को नोकोगिरी के साथ कैसे मान्य करूं?

मेरे लिए, यह: की एक पूरी ढेर में

doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org"))) 
puts doc.validate 

परिणाम:

[ 
#<Nokogiri::XML::SyntaxError: No declaration for element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute xmlns of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for element head>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute profile of element head 
[repeat for every tag in the document.] 
] 

तो मुझे लगता है कि सही दृष्टिकोण नहीं है यह सोचते हैं रहा हूँ। मुझे किसी भी अच्छे उदाहरण का पता लगाना प्रतीत नहीं होता - क्या कोई सुझाव दे सकता है कि मैं क्या गलत कर रहा हूं?

मै मैक ओएसएक्स 10.5.8 पर रूबी 1.8.6 चला रहा हूं। नोकोगिरी मुझे बताता है:

nokogiri: 1.3.3 
warnings: [] 

libxml: 
    compiled: 2.6.23 
    loaded: 2.6.23 
    binding: extension 

उत्तर

14

यह सिर्फ आप नहीं है। आप जो कर रहे हैं उसे करने का सही तरीका माना जाता है, लेकिन मुझे इसके साथ कोई भाग्य नहीं मिला है। जहां तक ​​मैं कह सकता हूं, वहां कुछ नॉकोगिरी और लिबक्सएमएल के बीच कुछ डिस्कनेक्ट है जो इसे SYSTEM डीटीडी लोड नहीं करता है, या PUBLIC डीटीडी को पहचानने के लिए नहीं करता है। यह काम करेगा यदि आप XML फ़ाइल के भीतर डीटीडी को परिभाषित करते हैं, लेकिन एक्सएमटीएम डीटीडी के साथ ऐसा करने में शुभकामनाएं।

सबसे अच्छी बात मैं सिफारिश कर सकते हैं बजाय schemas for XHTML उपयोग करने के लिए है:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::XML(open('http://www.w3.org')) 
xsd = Nokogiri::XML::Schema(open('http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd')) 

#this is a true/false validation 
xsd.valid?(doc) # => true 

#this gives a listing of errors 
xsd.validate(doc) # => [] 
+0

बहुत बढ़िया - यह निश्चित रूप से उत्पादन है मुझे उचित दिखने परिणाम (एक नज़र में!)। हालांकि, विचित्र रूप से, कुछ पेज जिन्हें मैं "xmlschemas.c: 27443" पर अनुपूरक ब्लॉक का उत्पादन ढेर मान्य कर रहा हूं - लेकिन फिर रिपोर्ट करने के लिए आगे बढ़ें कि वे कोई त्रुटि नहीं हैं। मुझे इस पैटर्न के निचले भाग तक नहीं मिला है और इस बिंदु पर नहीं हैं। – NeilS

1

ठीक काम करता है DTD एक्सएमएल में एम्बेडेड है। तो यदि एक फ़ाइल में डेटा को पुनर्गठन करना ठीक है, या तो सामान्य अभ्यास के रूप में, या केवल अस्थायी उपयोग के लिए, जो आपकी समस्या का समाधान करेगा।

मैं कम से Nokogiri परियोजना के साथ एक मुद्दा दायर:

https://github.com/sparklemotion/nokogiri/issues/440

योको हराडा, JRuby Nokigiri के प्राथमिक लेखक, ने कहा:

"बस FYI मास्टर शाखा पर शुद्ध जावा Nokogiri (नहीं। अभी तक जारी) इस समस्या नहीं है। "

मेरे द्वारा दायर की गई समस्या में समस्या का उदाहरण देने के लिए न्यूनतम उदाहरण फ़ाइलों और आईआरबी कॉल के लिंक शामिल हैं।

  • कीथ