سؤال

أريد اختبار (صواب أو خطأ) ما إذا كان ملف XML تعسفيًا يطابق مخططًا معينًا.

لما يستحق ، المخطط هو كلمة WordML Word 2003 ، والتي تحددها Microsoft باستخدام قائمة بحوالي 7 *.xsd الملفات.

يتضمن أحد هذه الملفات أيضًا W3C xml.xsd ملف ، من خلال تضمين البيان التالي:

<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace"
    schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import>

أنا أستخدم رمز .NET مثل ما يلي للقيام بالتحقق من الصحة:

   public static void validate(string filename)
    {
       XmlReaderSettings settings = new XmlReaderSettings();
       settings.Schemas.Add(
           "http://schemas.microsoft.com/office/word/2003/wordml",
           //to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe" 
           @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd"
           );
        settings.ValidationType = ValidationType.Schema;
        settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler);
        XmlReader xmlReader = XmlReader.Create(filename, settings);
        while (xmlReader.Read()) { }
   }

مشكلتي هي أنه إذا قمت بتشغيل هذا الرمز على جهاز غير متصل بالإنترنت ، فأنا أحصل على ملف XmlSchemaValidationException خطأ في تأثيره لا يمكن العثور عليه xml.xsd.

لإصلاح هذا ، قمت بتنزيل نسخة من xml.xsd ، وأضفتها بشكل صريح باستخدام settings.Schemas.Add الطريقة: يعمل التحقق الآن بشكل صحيح عندما لا يتم توصيل الجهاز بالإنترنت.

ومع ذلك ، عندما يتم توصيل الجهاز بالإنترنت ، أحصل الآن على خطأ في قول ذلك The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared..

من الواضح أنني إما بحاجة إلى إضافتها بشكل صريح ، أو لا أفعل ذلك ، اعتمادًا على ما إذا كان الجهاز قادرًا على تنزيله بصمت من الإنترنت (أو حتى ربما كان قادرًا على تنزيله سابقًا ، وقد تم تخزينه مؤقتًا في مكان ما).

لذلك ، إنه "ملعون إذا فعلت وملعون إذا لم أفعل". هل أحتاج إلى تجربته بطريقة واحدة ، والتقاط الاستثناء ثم جربه في الاتجاه الآخر؟ أم أن هناك حل أكثر أناقة؟

هل كانت مفيدة؟

المحلول

لا يمكننا رؤية الكود الخاص بك ، ولكن في العديد من التطبيقات ، يتم التعامل مع هذا عن طريق إعادة توجيه طلب .xsd إلى النسخة المحلية باستخدام محلل الكتالوج. هناك خاصية xmlreadersettings.xmlresolver التي يمكن استخدامها لهذا الغرض. يرى xmlcatalog.net للتنفيذ المرخص من Apache يمكنك استخدامه.

الآثار الجانبية لهذا هو أنه يمكنك الحفاظ على جميع المخططات محاكاة مؤقتًا محليًا. هذا مهم بشكل خاص لأن W3C ستحظر القراءات المفرطة على موقعها ويبدأ الرمز بشكل عشوائي (أو ما هو أسوأ ، رمز عميلك) في الفشل.

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