Java: проверка SAX-схемы - PullRequest
       2

Java: проверка SAX-схемы

1 голос
/ 13 марта 2012

Я следую двум схемам. Master.xsd и Child.xsd

  1. Child.xsd импортируется Master.xsd.
  2. Главный файл имеет целевое пространство имен 'pub'.
  3. В дочернем файле нет такого пространства имен.

Когда я пытаюсь проверить xml с Master.xsd, я получаю ошибку

org.xml.sax.SAXParseException: src-resol: Невозможно разрешить имя «author» в (n) компоненте «объявления элемента».

Я также пытался использовать в master.xsd, на этот раз я получаю похожую ошибку:

org.xml.sax.SAXParseException: src-resol: Невозможно разрешить имя «pub: author» для (n) компонента «объявления элемента».

Хотя это успешно подтверждено XMLSpy.

Вот схема, код вызова и код проверки:

Master.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:pub="http://schema.abc.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schema.abc.com">
    <xs:import schemaLocation="Child.xsd"/>
    <xs:element name="books">
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="pub:book"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="pub:published_date"/>
                <xs:element ref="author"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="published_date" type="xs:dateTime"/>
</xs:schema>

Child.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="author">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="first_name"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="first_name" type="xsd:string"/>
</xsd:schema>

Sample.xml, который необходимо проверить:

<?xml version="1.0" encoding="UTF-8"?>
<pub:books xsi:schemaLocation="http://schema.abc.com" xmlns:pub="http://schema.abc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <pub:book>
        <pub:published_date>2001-12-17T09:30:47Z</pub:published_date>
        <author>
            <first_name>Adi</first_name>
        </author>
    </pub:book>
</pub:books>

Java-код для проверки:

private void validate(final String schema, final String xml) {
        SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        InputStream is = getClass().getResourceAsStream(schema);
        Schema schema;
        try {
            schema = schemaFactory.newSchema(new StreamSource(is));
            Validator validator = schema.newValidator();
            Source xmlSource = new StreamSource( new StringReader(xml));

            validator.validate(xmlSource);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }

телефонный код:

validate(masterXSDPath, "xmlString");

Пожалуйста, скажите, где я иду не так ??

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Исправлено путем реализации LSResourceResolver.Child.xsd не был найден.

для получения дополнительных сведений см. Здесь https://stackoverflow.com/a/2342859/842210

2 голосов
/ 13 марта 2012

Я бы подумал, что вы хотите, чтобы обе схемы были доступны, таким образом, что-то вроде:

schemaFactory.newSchema(new Source[]{new StreamSource(is1), new StreamSource(is2)});

альтернативно, вы можете предоставить собственный LSResourceResolver для SchemaFactory.

...