Разбор схемы и импорт в одной схеме - PullRequest
3 голосов
/ 01 февраля 2011

Просто интересно, есть ли какие-нибудь способы для анализа xsd-файла И xsd, импортированного в исходный xsd одновременно, чтобы я мог получить прямой доступ к элементам в импортированном xsd.Существуют ли какие-либо платформы, которые делают это возможным?

Просто пример того, что я имею в виду

Из XSD, который я хочу проанализировать:

<xsd:import namespace="..." schemaLocation="anotherFile.xsd">

<xsd:element ref="anElement" />

Из XSD, импортированного в проанализированный файл

<xsd:element name="anElement"><xsd:simpleType><xsd:restriction base="xsd:string"><xsd:enumeration value="THIS" /><xsd:enumeration value="IS" /><xsd:enumeration value="THE" /><xsd:enumeration value="ELEMENTS" /><xsd:enumeration value="I" /><xsd:enumeration value="WANT" /><xsd:enumeration value=":-)" /></xsd:restriction></xsd:simpleType></xsd:element>

Итак, я хочу получить доступ к элементам в импортированном xsd, когда я анализирую оригинальный xsd с помощью какого-либо встраивания или чего-то еще: -)

Возможно ли это вкаким образом?

Ответы [ 3 ]

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

Да, вам просто нужно реализовать класс LSResourceResolver, который сможет читать из указанных вами схем схем:

 /**
 * This function validates a DomResult. T
 *
 * @param domResult
 * @param schemaFile path to the schmea file to validate against.
 * @throws org.xml.sax.SAXException
 * @throws java.io.IOException
 *
 */
protected void validateDomResult(DOMResult domResult, String schemaFile) throws SAXException, IOException, Exception {

    Schema schema = createSchema(schemaFile);
    javax.xml.validation.Validator validator = schema.newValidator();
    ErrorHandler mySchemaErrorHandler = new LoggingErrorHandler();
    validator.setErrorHandler(mySchemaErrorHandler);
    DOMSource domSource = new DOMSource(domResult.getNode());
    validator.validate(domSource);
    if (((LoggingErrorHandler) mySchemaErrorHandler).isError()) {
        throw new Exception("Validation Error");
    }
}

/**
 *
 * @param baseSchemaFilePath
 * @return
 * @throws java.lang.Exception
 *
 */
protected Schema createSchema(String baseSchemaFilePath) throws Exception {

    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    LSResourceResolver resourceResolver = (LSResourceResolver) new LocalSchemaLSResourceResolver();
    factory.setResourceResolver(resourceResolver);
    Schema schema = factory.newSchema(new File(baseSchemaFilePath));

    return schema;
}

Вот простая реализация LSResourceResolver, которая ищет схемы в каталоге xsd впуть к классу:

public class LocalSchemaLSResourceResolver implements LSResourceResolver{

    protected final Log logger = LogFactory.getLog(getClass());

    public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) {

        LSInput input = new DOMInputImpl();
        try {
            FileInputStream fis = new FileInputStream(new File("classpath:xsd/" + systemId));

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

    }
}
1 голос
/ 03 декабря 2014

Это работает для меня, когда файлы XSD находятся в локальном каталоге / src / main / resources или упакованы в jar:

final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
final URL url = this.getClass().getClassLoader().getResource("META-INF/parent.xsd");
final Schema schema = sf.newSchema(url);

parent.xsd включает «kid.xsd» - оба XSD-файла находятся в одном каталоге

1 голос
/ 01 февраля 2011

Похоже, вам нужен JAXB, чтобы получить вашу схему (включая импортированную схему) в классах Java.

...