Проверка XML-файлов в Java по двум схемам с одинаковым пространством имен - PullRequest
2 голосов
/ 24 февраля 2011

у меня

  1. XML-документ,
  2. базовый XSD-файл и
  3. расширенный файл XSD.

Оба XSD-файла имеют одно пространство имен.

Файл 3) включает в себя файл 2): <xs:include schemaLocation="someschema.xsd"></xs:include>

XML-документ (файл 1) имеет следующий корневой тег:

<tagDefinedInSchema xmlns="http://myurl.com/myapp/myschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myurl.com/myapp/myschema schemaFile2.xsd">

, где schemaFile2.xsd - файл 3 выше.

Мне нужно проверить файл 1 по обеим схемам, без

  1. изменение самого файла и

  2. объединение двух схем в один файл.

Как я могу сделать это на Java?

UPD: вот код, который я использую.

SchemaFactory schemaFactory = SchemaFactory
        .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
DocumentBuilderFactory documentFactory = DocumentBuilderFactory
        .newInstance();
documentFactory.setNamespaceAware(namespaceAware);
DocumentBuilder builder = documentFactory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlData
        .getBytes("UTF-8")));

File schemaLocation = new File(schemaFileName);
Schema schema = schemaFactory.newSchema(schemaLocation);

Validator validator = schema.newValidator();

Source source = new DOMSource(document);

validator.validate(source);

UPD 2: у меня это работает:

    public static void validate(final String xmlData,
        final String schemaFileName, final boolean namespaceAware)
        throws SAXException, IOException {
    final SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    schemaFactory.setResourceResolver(new MySchemaResolver());
    final Schema schema = schemaFactory.newSchema();

    final Validator validator = schema.newValidator();
    validator.setResourceResolver(schemaFactory.getResourceResolver());

    final InputSource is = new InputSource(new ByteArrayInputStream(xmlData
            .getBytes("UTF-8")));
    validator.validate(new SAXSource(is), new SAXResult(new XMLReaderAdapter()));
}



class MySchemaResolver implements LSResourceResolver {

@Override
public LSInput resolveResource(final String type,
        final String namespaceURI, final String publicId, String systemId,
        final String baseURI) {
    final LSInput input = new DOMInputImpl();
    try {
        if (systemId == null) {
            systemId = SCHEMA1;
        }
        FileInputStream fis = new FileInputStream(
                new File("path_to_schema_directory/" + systemId));

        input.setByteStream(fis);
        return input;
    } catch (FileNotFoundException ex) {
        LOGGER.error("File Not found", ex);
        return null;
    }

}

}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Немного терминологии: у вас есть одна схема, которая построена из двух документов схемы.

Если вы указываете schemaFile2.xsd для API при построении схемы, он должен автоматически загружать другой документ через xs: include. Если вы подозреваете, что этого не происходит, вам нужно объяснить, какие симптомы заставляют вас в это верить.

0 голосов
/ 24 февраля 2011

Это может показаться немного неэффективным, но не могли бы вы проверить по схеме A, создать новый валидатор, используя схему B, и проверить по нему тоже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...