使用Jing与Google App Engine。不能加载SchemaFactory给定放松NG架构
-
13-11-2019 - |
题
好的,所以这是我想要实现的缺点。我正在开发一个小的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
事实证明,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文件中设置系统属性,因为这可能会在启动序列中更改。