Java: проверка SAX схемы
-
12-12-2019 - |
Вопрос
Я следую в двух схемах. Master.xsd и child.xsd
- child.xsd импортируется master.xsd.
- Мастер-файл имеет целевой паб пространства имен.
- Детский файл Нет такого пространства имен.
Когда я пытаюсь подтвердить XML с Master.xsd, я получаю ошибку
org.xml.sax.saxparseException: SRC-RESOLVE: не может разрешить имя «автор» на компонент объявления «автор» на (N) ».
Я также пытался использовать в Master.xsd, на этот раз я получаю аналогичную ошибку:
org.xml.sax.saxparseException: SRC-RESOLVE: не может разрешить имя «Паб: автор» на компонент объявления элемента (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>
.
thumbs.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
Исправлено его путем внедрения LsresourcereSolver. Child.xsd не найден.
Посмотрите здесь для большего количества детенов https://stackoverflow.com/a/2342859/842210
Другие советы
Я бы представлял, что вы хотите, чтобы обе схемы доступны, таким образом, что-то вроде:
schemaFactory.newSchema(new Source[]{new StreamSource(is1), new StreamSource(is2)});
.
попеременно, вы можете предоставить пользовательский Lsresourcerever для схемы.