كيفية معرفة ما إذا كانت وثيقة XML بالتحقق من صحة ضد DTD أو XSD؟

StackOverflow https://stackoverflow.com/questions/496369

سؤال

في جاوة، ويمكن التحقق من صحة وثيقة XML ضد مخطط XSD باستخدام javax.xml.validation.Validator، أو ضد DTD ببساطة عن طريق تحليل المستند باستخدام org.xml.sax.XMLReader.

وماذا أحتاج الرغم من وسيلة لتحديد برمجيا ما إذا كانت الوثيقة نفسها بالتحقق من صحة ضد DTD (أي أنه يحتوي على بيان <!DOCTYPE ...>) أو XSD. من الناحية المثالية يجب أن أفعل ذلك دون تحميل المستند XML بالكامل في الذاكرة. يمكن لأي شخص الرجاء المساعدة؟

و(بدلا من ذلك، إذا كان هناك <م> واحدة طريقة التحقق من صحة وثيقة XML في جاوة أن يعمل كل XSDs وتدس - ويسمح للعرف حل للموارد - من شأنه أن يكون أفضل)

وشكرا جزيلا،

A

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

المحلول

وليس هناك عملية مضمونة 100٪ لتحديد كيفية التحقق من صحة مستند XML التعسفية.

وعلى سبيل المثال، هذا الإصدار 2.4 تطبيق ويب نشر اصف يحدد <لأ href = " http://www.w3.org/XML/Schema "يختلط =" نوفولو noreferrer "> W3 مخطط للتحقق من صحة مستند:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

ولكن، وهذا هو وسيلة صالحة بالتساوي للتعبير عن الشيء نفسه:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee">

RELAX NG لا يبدو أن لديها آلية العروض <م> أي تلميحات في الوثيقة التي يجب استخدامها. يتم تحديد آليات المصادقة من قبل المستهلكين وثيقة، وليس المنتجين. إذا لم أكن مخطئا، وكان هذا واحدا من impetuses يقود التحول من DTD إلى المزيد من آليات التحقق من صحة الحديثة.

في رأيي، أفضل رهان هو تفصيل للكشف عن آلية لمجموعة من أنواع المستندات كنت تجهيز والقراءة معلومات رأس وتفسير ذلك حسب الاقتضاء. و ستاكس محلل عبارة جيدة لهذا - لأنه هو آلية سحب، يمكنك أن تقرأ مجرد بداية الملف ثم قم بإنهاء تحليل على العنصر الأول

لينك لأكثر من نفس ونموذج التعليمات البرمجية وغيرها.

نصائح أخرى

وراجع وصف حزمة javax.xml.validation . أنه يحتوي على معلومات حول وأمثلة للتحقق من صحة كل من XSDs وتدس

هل يمكن أن مجرد استخدام مقارنات السلسلة؟

public enum Type {
    XSD,
    DTD,
    UNKNOWN
};

public Type findType(File f) throws FileNotFoundException, IOException {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(f));
        String line;
        // may want to cut this loop off after a certain number of lines
        while ((line = reader.readLine()) != null) {
            line = line.toLowerCase();
            if (line.contains("<!doctype"))
                return Type.DTD;
            else if (line.contains("xsi:schemaLocation"))
                return Type.XSD;
        }
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ex) {}
        }
    }
    return Type.UNKNOWN;
}

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

وشكرا جزيلا

ودينيس.

وطيب وجدت ما يلي:

    XMLReader reader = XMLReaderFactory.createXMLReader();

    // try to activate validation
    try {
          // Turn on validation
          reader.setFeature("http://xml.org/sax/features/validation", true);
          // Ensure namespace processing is on (the default)
          reader.setFeature("http://xml.org/sax/features/namespaces", true);
    } catch (SAXException e) {
        System.err.println("Cannot activate validation.");
    }

    try {
        reader.parse("testFiasRequest.xml");
    } catch (IOException e) {
        System.err.println("I/O exception reading XML document");
    } catch (SAXException e) {
        System.err.println("XML exception reading document.");
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top