Проверка XML по локальному DTD. Проблемы с EntityResolver2 - PullRequest
1 голос
/ 20 сентября 2011

Я должен проверить некоторые XML-файлы в локальном DTD-файле.XML может быть без DOCTYPE.Вот тело моего основного метода:

XMLReader reader;
    DTDManipulator dtdhandler;
    XMLValidationEvendHandler errorhandler = new XMLValidationEvendHandler();
    try {
        dtdhandler = new DTDManipulator();
        dtdhandler.setDTDentity("file:///Users/hp/Desktop/BOX/A/Ordinanze.dtd");
        reader = XMLReaderFactory.createXMLReader();
        reader.setErrorHandler(errorhandler);
        reader.setEntityResolver(dtdhandler);   
        //reader.setFeature("http://xml.org/sax/features/use-entity-resolver2", true);
        reader.setFeature("http://xml.org/sax/features/validation",true);

        reader.parse(new InputSource("OT201011120071_045NODTD.xml"));
        if(errorhandler.isNoerrors()) {
            System.out.println("SUCCESS!");
        }
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }
    for(int i=0; i<errorhandler.getExceptionOccurred().length; i++) System.out.println(errorhandler.getExceptionOccurred()[i].getMessage());
    System.exit(0);

DTD реализует EntityResolver2:

public class DTDManipulator implements EntityResolver2 {

private String dtd;

public void setDTDentity(String entity) {
    System.out.println("DTDManipulator.setDTDentity:");
    System.out.println(" - entity = "+entity);
    dtd = entity;
}

@Override
public InputSource resolveEntity(String publicId, String systemId)
        throws SAXException, IOException {
    System.out.println("DTDManipulator.resolveEntity:");
    System.out.println(" - publicId = "+publicId);
    System.out.println(" - systemId = "+systemId);
    System.out.println(" - get back = "+"");
    return new InputSource(dtd);
}

@Override
public InputSource getExternalSubset(String name, String baseURI)
        throws SAXException, IOException {
    System.out.println("DTDManipulator.getExternalSubset:");
    System.out.println(" - name = "+name);
    System.out.println(" - baseURI = "+baseURI);
    System.out.println(" - get back = "+dtd);
    return new InputSource(dtd);
}

@Override
public InputSource resolveEntity(String name, String publicId,
        String baseURI, String systemId) throws SAXException, IOException {
    System.out.println("DTDManipulator.resolveEntity:");
    System.out.println(" - name = "+name);
    System.out.println(" - publicId = "+publicId);
    System.out.println(" - baseURI = "+baseURI);
    System.out.println(" - systemId = "+systemId);
    System.out.println(" - get back = "+dtd);
    return new InputSource(dtd);
}   

}

}

Когда я пытаюсь проверитьXML-ссылки DTD внутри я получил неожиданное поведение: DOCTYPE не добавляется до корня документа, метод getExternalSubset DTDManipulator никогда не вызывается.Я не могу догадаться почему, чего мне не хватает?Заранее спасибо, извините за мой английский.

Франческо

...