1

さて、これが私が達成しようとしていることの不足です。特定のオブジェクトを指定してXMLを生成する小さなGoogleAppEngineアプリケーションを開発しています。

ここで、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グループに投稿してみましたが、誰もアイデアを思いつきませんでした。

注:この例から上記のコードの一部を使用しました:RELAX NGスキーマとJAXPを使用してXMLドキュメントを検証する方法は?

私の疑いは、AppEngineが何らかの理由でJing.jarをロードしていないことです。どうすれば確認できるのかわかりません。

どんな助けでもいただければ幸いです!ありがとう!

4

3 に答える 3

3

明確にするためにこの投稿。

JingとRelaxNGを使用してXMLドキュメントを検証する通常の方法は次のとおりです。

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と交換します。

于 2011-03-18T15:30:32.040 に答える
0

System.setProperty()それは失敗している、あるいは正しく使用されていないのではないかと思います。ドキュメントによると:

すべてのシステムプロパティと環境変数は、アプリケーション専用です。システムプロパティの設定は、そのプロパティのアプリケーションのビューにのみ影響し、JVMのビューには影響しません。

SchemaFactoryがJDKの一部である場合(私はそうだと思います)、リセットできない場合があります。ただし、 appconfigファイルでシステムプロパティを設定すると、起動シーケンスの早い段階で変更される可能性があるため、運が良い場合があります。

于 2011-02-14T05:21:07.037 に答える
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);

チャームのように働いた。

于 2011-02-15T07:00:31.587 に答える