Проверка XML не проверяет функции

Я хочу проверить файл XML на соответствие внешнему описанию XSD. Вот объект Schema, созданный из моего XSD

       private static Schema xmlSchema; 
       try {
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            String FEATURE= "";
           // forbid DOCTYPE
            FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
           factory.setFeature(FEATURE, true);
           xmlSchema = factory.newSchema(new File(XML_XSD_SCHEME));
        } catch (Exception e) {

        }

Кроме того, я создал статический метод validateXMLSchema, отвечающий за проверку XML-файлов:

public static boolean validateXMLSchema(String xmlPath) {

    if (xmlSchema == null) {
        return false;
    }

    InputStream inputStream = null;
    try {
        URL xmlFileURL = new File(xmlPath).toURI().toURL();

        inputStream = xmlFileURL.openStream();
        SAXSource saxSource = new SAXSource(new InputSource(inputStream));

        Validator validator = xmlSchema.newValidator();

        String FEATURE ="";

        // disallow DOCTYPE
         FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
         validator.setFeature(FEATURE, true);

        //forbid external Entity 
        FEATURE ="http://xml.org/sax/features/external-general-entities";
        validator.setFeature(FEATURE, false);

        //forbid external parameters
        FEATURE ="http://xml.org/sax/features/external-parameter-entities";

        validator.setFeature(FEATURE, false);

        validator.validate(saxSource);

    } catch (Exception e) {
        return false;
    } finally {
        try {
            inputStream.close();
        } catch (IOException e) {
        }
    }
    return true;
}

Проблема в том, что даже если я добавил определение внешнего объекта в свой файл XML <!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY......, метод validateXMLSchema возвращает true. Кто-нибудь может мне помочь?


person ikken    schedule 26.01.2016    source источник


Ответы (1)


Я предполагаю, что вы хотели, чтобы эти функции применялись к синтаксическому анализатору SAX, который читает XML-документ. Попробуйте создать новый XMLReader и явно настроить его перед передачей SAXSource в Validator:

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader reader = spf.newSAXParser().getXMLReader();

String FEATURE ="";

// disallow DOCTYPE
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
reader.setFeature(FEATURE, true);

//forbid external Entity 
FEATURE ="http://xml.org/sax/features/external-general-entities";
reader.setFeature(FEATURE, false);

//forbid external parameters
FEATURE ="http://xml.org/sax/features/external-parameter-entities";
reader.setFeature(FEATURE, false);

SAXSource saxSource = new SAXSource(reader, new InputSource(inputStream));

Validator validator = xmlSchema.newValidator();

validator.validate(saxSource);
person Michael Glavassevich    schedule 28.01.2016
comment
Спасибо. Это правильный способ установки функций с использованием внешней проверки XSD. У меня все еще есть некоторые трудности, но я уверен, что это связано с моей реализацией и версией JAVA. Большое спасибо - person ikken; 29.01.2016