スキーマ情報が XML から取得されるように、XML スキーマに対して XML ファイルを検証する必要があります。
名前空間を定義する XML ドキュメントがあります。このような:
<?xml version="1.0" encoding="UTF-8"?>
<myelement xmlns="mynamespace">
</myelement>
スキーマの場所はドキュメントにないため、指定された名前空間のスキーマがどこにあるかをバリデーターに伝える必要があります。今、私は次の方法でそれを行います:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
DocumentBuilder parser = dbf.newDocumentBuilder();
Document document = parser.parse(new File("mydocument.xml"));
String namespace = document.getChildNodes().item(0).getNamespaceURI();
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(new DOMSource(document));
このように動作しますが、2 つの問題があります。
1) 最初に手動でドキュメントを解析し、スキーマを作成する必要があるのは、理論的にはバリデーターが自動的に行うために必要なすべての情報を持っているにもかかわらず、ちょっと不器用です。
2) Document オブジェクトを検証すると、エラーの正しい行番号が得られません。正しい行番号を取得するには、同じドキュメントを 2 回解析する必要があります (1 回目は名前空間を取得し、2 回目は検証します)。
誰かがより良い解決策を知っていますか?
解析する前に、namespace1 が schema1.xsd、namespace2 が schema2.xsd などに対応することをパーサーに伝える方法はありますか? または、パーサーがスキーマを要求するために使用できる何らかのコールバックを作成できますか (たとえば、LSResourceResolver を SchemaFactory に渡すことができます)?