2011-02-13 1 views
0

さて、ここでは私が達成しようとしているものの短いです。私は特定のオブジェクトを与えられたXMLを生成する小さなGoogle App Engineアプリケーションを開発しています。Google App EngineでJingを使用しています。リラックスNGスキーマを指定してSchemaFactoryを読み込めません

私はRelax NGスキーマを使用し、それを私のDocumentオブジェクトに対して検証する必要があるため、問題にぶつかります。これはローカルマシン(Eclipse Helios Java EE、Mac OS X Snow Leopard、Google Web Toolkit 2.2.0、App Engine 1.4.2)で正常に動作しますが、App Engineにデプロイするとすぐにコードが失敗し、IllegalArgumentExceptionがスローされます。

特定の例外がこれです:

java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://relaxng.org/ns/structure/1.0 could be loaded 

それが不満されていること、コードの特定の行(単数または複数)は以下の通りである:

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory"); 
    SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI); 

最後の行がスローラインであります例外。

私はオンラインで探してみましたが、いくつかのGoogleグループに投稿しましたが、アイデアは出ていませんでした。

注:私は、この例から、上記のコードの一部の使用を取っ:How to validate an XML document using a RELAX NG schema and JAXP?

私の疑惑は、App Engineは、何らかの理由でJing.jarをロードしていないことです。私はどのように私はそれが/ではないことを確認することができません。

助けていただけたら幸いです!ありがとう!

答えて

0

まあ、実際には、System.setPropertyの(実質的にハックな)使用を完全に取り除くソートの回避策が見つかりました。

Jingには「CompactSyntaxSchemaFactory」という小さなクラスがあります。ここで

は、私はそれを使用する方法である:

DocumentBuilderFactory docFactory = null; 

    CompactSyntaxSchemaFactory scReader = new CompactSyntaxSchemaFactory(); 
    URL relaxSchemaURL = new URL("http://example.com/myschema.rng"); 
    Schema2 relaxSchema = scReader.newSchema(relaxSchemaURL); 

    docFactory = DocumentBuilderFactory.newInstance(); 
    docFactory.setSchema(relaxSchema); 

が魅力のように働きました。

0

私はSystem.setProperty()が失敗しているか、正しく使用されていないと思います。 the docsによると:

すべてのシステムプロパティと環境変数は、アプリケーションにとってプライベートです。システムプロパティを設定するのは、JVMのビューではなく、そのプロパティのアプリケーションビューだけに影響します。

もしSchemaFactoryがJDKの一部であれば、それをリセットすることができないかもしれません。ただし、システムのプロパティーをappconfig fileに設定すると、スタートアップシーケンスの早い段階で変更される可能性があります。

+0

うん...それは確かにそれを説明するかもしれません。私は投稿した作品を見つけました。 – Adub

2

この記事は、明確にするためのものです。私はジンを使用してXMLドキュメントを検証し、NGをリラックスでしょう

通常の方法は次のとおりです。

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory"); 
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI); 
Schema schema = factory.newSchema(new File("path/to/schema.rng")); 

Validator validator = schema.newValidator(); 
validator.validate(new StreamSource(new StringReader(xmlString))); 

さて、App Engineの中で、最初の2行は仕事、とはIllegalArgumentExceptionがスローされることはありませんが、あなたが言ったように。だから彼らと交換する

SchemaFactory factory = new XMLSyntaxSchemaFactory(); 

トリックします。要約(インポートを含む):

import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import javax.xml.validation.Validator; 
import com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory; 

SchemaFactory factory = new XMLSyntaxSchemaFactory(); 
Schema schema = factory.newSchema(new File("path/to/schema.rng")); 

Validator validator = schema.newValidator(); 
validator.validate(new StreamSource(new StringReader(xmlString))); 

これはXML構文のスキーマ用です。コンパクトな構文の場合は、XMLSyntaxSchemaFactoryをCompactSyntaxSchemaFactoryと交換します。

関連する問題