5

XSDファイルに対してXMLを検証するコマンドラインプログラムがあります。このプログラムのコマンドラインオプションの1つは、使用する名前空間です。これは、に格納されていString namespaceます。namespace解析されたオプションをとして渡すか、呼び出しをに渡すかによって、異なる検証結果が得られますnamespace.intern()。結果が異なるということは、XMLバリデーターのどこかで、String名前空間で実行された比較の結果が異なることを意味します。ただし、ASCII値のセットは同じである必要があります。

これらが異なる比較結果を生成する可能性がある根本的な理由はありますか?

以下を参照してください。NamespaceFilterクラスは、名前空間の値が使用される場所です。namespaceこのクラスは、内部の現在の要素で見つかった値と比較してstartElement、それを割り当てます。 startElementXMLリーダーによって呼び出されます。

これらは、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);

    }
}
4

1 に答える 1

1

endElement()同様のロジックを使用して、オーバーライドする必要もあります。そうしないと、開始要素の URI と終了要素の URI が一致しない可能性があります。XMLFilterImplおそらく、.equals() ではなく == で一致しています。

于 2012-07-03T01:44:57.813 に答える