5

複数の xsd スキーマを使用して XML ドキュメントを検証していました。これは、私がそれを行うために使用していたコードです。

public static Schema createSchemaXSD(InputStream inputXSD, LSResourceResolver resolver) throws SAXException {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    factory.setResourceResolver(resolver);
    Source schemaSource = new StreamSource(inputXSD);
    Schema schema = factory.newSchema(schemaSource);
    return schema;
}

LSResourceResolverルート スキーマがその xsd に含める xsd スキーマのロードを解決できるクラスを開発するためのインターフェイスです。私のスキーマは(ファイルシステムではなく)そこにパックされているので、クラスパスからインクルードファイルをロードする実装を書きました

突然、複数の DTD に対して検証するように切り替える必要が生じたため、コードを次のように変更しました。

public static Validator createValidatorDTD(InputStream inputDTD, LSResourceResolver resolver) throws SAXException {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI);
    factory.setResourceResolver(resolver);
    Source schemaSource = new StreamSource(inputDTD);
    Schema schema = factory.newSchema(schemaSource);
    Validator validator = schema.newValidator();
    return validator;
}

残念ながら、これは機能しません。SchemaFactory のファクトリを作成すると、例外がスローされます。

No SchemaFactory that implements the schema language specified by: http://www.w3.org/TR/REC-xml could be loaded

記事に基づいて調査を行いました: Java XML Validation API and java.xml.validation documentation。どちらもXMLConstants.XML_DTD_NS_URIサポートされているが、Sun の JDK 5 (および私が見る限り JDK 6) では実装されておらず、DTD 検証をサポートする他のライブラリを使用する必要があることを指定しています。

Google で検索しようとしましたが、何も見つかりませんでした (または、検索方法がわかりませんでした)。DOM と TrAX を使用して DTD に対してドキュメントを検証できることは知っていますが、これらにはファイルシステムに DTD が必要です。私の DTD とスキーマはクラスパス上にあるため、DTD のカスタム ロードが必要です。そのため、最初にjavax.xml.validation.SchemaFactoryandを使用しました。これはjavax.xml.validation.Schema、はるかに大きな柔軟性を提供するためです。

XML_DTD_NS_URIだから私の質問は、私が使用できるJava 検証 API ( ) を介して DTD 検証をサポートするライブラリ (またはライブラリ) はありますか? 私はさまざまな種類のソリューションを受け入れています。

4

1 に答える 1

0

回避策は、DTD と XML を連結し、.schema なしで解析または検証することです。例:

String dtd;
String xml;
....
....

src = new InputSource( new ByteArrayInputStream( (dtd + xml).getBytes()) );
try {
    factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringComments(true);
    builder = factory.newDocumentBuilder();
    partnersDoc = builder.parse(src);
} catch ( ParserConfigurationException ex ){
    ex.printStackTrace(System.err);
}
于 2015-07-15T23:34:28.013 に答える