0

スキーマ情報が 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 に渡すことができます)?

4

1 に答える 1

0

現在、スキーマが利用できないため、パーサーがスキーマに対してドキュメントを検証する方法はありません (また、パーサーはドキュメントを検証するように構成されていません)。これを自動的に達成するには、次の 2 つのオプションがあると思います。

  1. XML を編集して xsi:schemaLocation 属性を含めます (ただし、これがまったくサポートされているかどうかはわかりません)。

  2. 名前空間のスキーマを登録します。

コード:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File(namespace + ".xsd"));
Schema schema = factory.newSchema(schemaFile);

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware( true );
dbf.setValidating(true);
dbf.setSchema(schema);
于 2009-10-22T12:46:37.737 に答える