1

Xerces は、次のように XML カタログのサポートをリーダーに追加できると主張しています。

XMLCatalogResolver resolver = new XMLCatalogResolver();
resolver.setPreferPublic(true);
resolver.setCatalogList(catalogs);

XMLReader reader = XMLReaderFactory.createXMLReader(
    "org.apache.xerces.parsers.SAXParser");
reader.setProperty("http://apache.org/xml/properties/internal/entity-resolver",
    resolver);

しかし、これを行うとすぐ<xs:include/>に、スキーマ内のタグは処理されなくなります。が追加されると、エンティティ解決のための唯一の場所になるように思われるXMLCatalogResolverため、インクルードは機能しなくなります。Eclipse OTOH は同じカタログを使用して正常に検証するため、可能性があるはずです。

これを回避する方法はありますか、またはカタログをサポートする他の Java ベースのバリデーターはありますか?

ありがとう、ドミニク。

4

1 に答える 1

1

XMLCatalogResolverメソッドに対して行われたさまざまな呼び出しをオーバーライドしてログに記録することで、最終的にこれを解決しましたresolveEntity()。私は 3 種類の呼び出しが行われていることを確認しましたが、XML カタログを使用して解決する意味があるのはそのうちの 1 つだけでした。FileInputStreamそのため、他の 2 つの呼び出しタイプに対して直接a を返しただけです。

カスタムXMLCatalogResolverクラス内で使用したコードは次のとおりです。

public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)
    throws IOException
{
    if(resourceIdentifier.getExpandedSystemId() != null)
    {
        return new XMLInputSource(resourceIdentifier.getPublicId(),
            resourceIdentifier.getLiteralSystemId(),
            resourceIdentifier.getBaseSystemId(),
            new FileReader(getFile(resourceIdentifier.getExpandedSystemId())),
            "UTF-8");
    }
    else if((resourceIdentifier.getBaseSystemId() != null) &&
        (resourceIdentifier.getNamespace() == null))
    {
        return new XMLInputSource(resourceIdentifier.getPublicId(),
            resourceIdentifier.getLiteralSystemId(),
            resourceIdentifier.getBaseSystemId(),
            new FileReader(getFile(resourceIdentifier.getBaseSystemId())),
            "UTF-8");
    }
    else
    {
        return super.resolveEntity(resourceIdentifier);
    }
}

private File getFile(String urlString) throws MalformedURLException
{
    URL url = new URL(urlString);
    return new File(url.toURI());
}

これが Xerces 内でデフォルトで行われない理由はわかりませんが、この問題に遭遇した次の人に役立つことを願っています。

于 2012-04-06T05:01:31.890 に答える