XSDファイルに対してXMLを検証するコマンドラインプログラムがあります。このプログラムのコマンドラインオプションの1つは、使用する名前空間です。これは、に格納されていString namespace
ます。namespace
解析されたオプションをとして渡すか、呼び出しをに渡すかによって、異なる検証結果が得られますnamespace.intern()
。結果が異なるということは、XMLバリデーターのどこかで、String
名前空間で実行された比較の結果が異なることを意味します。ただし、ASCII値のセットは同じである必要があります。
これらが異なる比較結果を生成する可能性がある根本的な理由はありますか?
以下を参照してください。NamespaceFilter
クラスは、名前空間の値が使用される場所です。namespace
このクラスは、内部の現在の要素で見つかった値と比較してstartElement
、それを割り当てます。 startElement
XMLリーダーによって呼び出されます。
これらは、validateAgainstXSD内のラインバリエーションです。
String.intern()
NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace.intern());
結果:
uart.xmlを検証しています。
文字列オブジェクトをそのまま
NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace);
結果:
エラー4:cvc-complex-type.2.4.a:要素'fileVersion'で始まる無効なコンテンツが見つかりました。'{"myNamespace":fileVersion}'のいずれかが必要です。
コンテキスト内のソース
public static void validateAgainstXSD(File file, File schemaFile, String namespace) {
try {
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema xsdScheme = factory.newSchema(schemaFile);
Validator validator = xsdScheme.newValidator();
ErrorHandler eh = new DefaultErrorHandler();
validator.setErrorHandler(eh);
// Create namespace replacement filter
NamespaceFilter nsf = new NamespaceFilter(XMLReaderFactory.createXMLReader(), namespace.intern());
// Load the XML source
SAXSource source = new SAXSource(nsf, new InputSource(new FileInputStream(file)));
validator.validate(source, null);
} catch (Exception e) {
e.printStackTrace();
}
}
private static class NamespaceFilter extends XMLFilterImpl {
private String requiredNamespace;
public NamespaceFilter(XMLReader parent) {
super(parent);
}
public NamespaceFilter(XMLReader parent, String namespace) {
this(parent);
requiredNamespace = namespace;
}
@Override
public void startElement(String uri,
String localName,
String qName,
Attributes atts)
throws SAXException {
if (!uri.equals(requiredNamespace)) {
uri = requiredNamespace;
}
super.startElement(uri, localName, qName, atts);
}
}