好的,所以这是我想要实现的缺点。我正在开发一个小的Google App Engine应用程序,它为特定对象提供XML。 现在,我遇到问题,因为我需要使用放松NG架构并对我的文档对象验证。这在我的本地机器上工作正常(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);
.

最后一行是抛出异常的行。

我试过在线看,并在几个谷歌群体中发布,但没有人以一个想法出现。

注意:我从这个例子中使用了一些上面的代码:如何使用放松ng架构和JAXP验证XML文档?

我的怀疑是由于某种原因,App Engine没有加载Jing.jar。我不知道如何检查它是/不是。

任何帮助都会受到赞赏!谢谢!

有帮助吗?

解决方案 3

好吧,我实际上发现了一种完全取出(实际上乱砍)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);
.

像魅力一样工作。

其他提示

这篇文章只是为了澄清。

通常的方式我将使用jing和belax 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中,前两行不起作用,并导致抛出违法的抛弃,就像你说的那样。所以用交换它们
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语法中的模式。具有CompactSyntaxSchemafactory的Compact Syntax,Exchange XMLSyntaxSchemactory。

我猜生物逻辑测定代码失败,或者而不是正确使用。根据 docs

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top