で2つのスキーマに対して、JavaでXMLファイルを検証するには、私が同じ名前空間
- XMLドキュメント、
- ベースXSDファイルと
- 拡張XSDファイルを持っています。
両方のXSDファイルには1つの名前空間があります。ルートタグ下記た<xs:include schemaLocation="someschema.xsd"></xs:include>
XML文書(ファイル1):
ファイル3)は、ファイル2)を含むschemaFile2.xsd
ファイル3上で
<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">
。
Iは
は、ファイル自体と
1つのファイルに2つのスキーマをマージを変更することなく、両方のスキーマに対するファイル1を検証する必要があります。
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;
}
}
}
ファイルを解析するためにどのようなメカニズムを使用していますか? – skaffman
私の質問にコードを追加しました。 –
コードschemaFileNameはschemaFile2.xsd(拡張XSDファイル)でなければなりません。 –