سؤال

لقد وجدت بعض الوظائف التي تتلئ إلى حقيقة أنه يمكنك التحقق من صحة XHTML مقابل DTD باستخدام GEM Nokogiri. في حين تمكنت من استخدامها لتحليل XHTML بنجاح (تبحث عن علامات "A" وما إلى ذلك)، فأنا تكافح من أجل التحقق من صحة المستندات.

بالنسبة لي، هذا:

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.]
]

لذلك أنا أفترض أن هذا ليس النهج الصحيح. لا أستطيع تحديد موقع أي أمثلة جيدة - هل يمكن لأي شخص أن يقترح ما أفعله خطأ؟

أنا أركي روبي 1.8.6 على Mac OSX 10.5.8. أخبرني Nokogiri:

nokogiri: 1.3.3
warnings: []

libxml: 
  compiled: 2.6.23
  loaded: 2.6.23
  binding: extension
هل كانت مفيدة؟

المحلول

انها ليست فقط لك. ما تفعله من المفترض أن تكون الطريقة الصحيحة للقيام بذلك، لكنني لم يكن لدي أي حظ. بقدر ما أستطيع أن أقول، هناك بعض قطع الاتصال في مكان ما بين Nokogiri و Libxml مما يؤدي إلى تحميله SYSTEM DTDS، أو للتعرف PUBLIC DTDS. هو - هي إرادة العمل إذا حددت DTD داخل ملف XML، ولكن حظا سعيدا في القيام بذلك باستخدام XHTML DTDs.

أفضل شيء يمكنني أن أوصي به هو استخدام مخططات 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)  # => []

نصائح أخرى

يعمل بشكل جيد إذا تم تضمين DTD في XML. لذلك إذا كان إعادة هيكلة البيانات الموجودة في ملف واحد على ما يرام، إما كممارسة عامة، أو فقط للاستخدام المؤقت، من شأنها أن تحل مشكلتك.

قدمت مشكلة في مشروع Nokogiri في:

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

قال يوكو هارادا، المؤلف الأساسي ل Jruby Nokigiri،:

"فقط لمعلوماتك. Java Nokogiri النقي على فرع الماجستير (لم يتم إصدارها بعد) لا تملك هذه المشكلة."

تحتوي المشكلة التي قدمتها على روابط إلى الحد الأدنى من الملفات المثالة ومكالمات IRB لتوضيح المشكلة.

  • كيث
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top