1

好的,这就是我想要实现的目标。我正在开发一个小型 Google App Engine 应用程序,它可以在给定特定对象的情况下生成 XML。

现在,我遇到了问题,因为我需要使用 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。我不知道如何检查它是/不是。

任何帮助,将不胜感激!谢谢!

4

3 回答 3

3

这篇文章只是为了澄清。

我使用 Jing 和 Relax NG 验证 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 中,前两行不起作用,并导致抛出 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 的(实际上是骇人听闻的)使用。

原来,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 回答
0

我猜这System.setProperty()是失败的,或者说没有正确使用。根据文档

所有系统属性和环境变量都是您的应用程序私有的。设置系统属性只会影响应用程序对该属性的视图,而不影响 JVM 的视图。

如果 SchemaFactory 是 JDK 的一部分(我认为是),您可能无法重置它。但是,您可能会更幸运地在appconfig 文件中设置系统属性,因为这可能会在启动序列的早期进行更改。

于 2011-02-14T05:21:07.037 回答