如何使用导入另一个模式文件的模式文件验证XML?

时间:2013-03-25 16:16:08

标签: java xml xsd moxy xsd-validation

我想针对this schema验证XML文件(在zip中);它导入了另外两个XSD文件。

   <import namespace="http://www.w3.org/2000/09/xmldsig#" 
       schemaLocation="xmldsig-core-schema.xsd"/>
   <import namespace="http://www.w3.org/2001/04/xmlenc#" 
       schemaLocation="xenc-schema.xsd"/>

这里也有2个文件:

验证时,我收到此错误:

Src-resolve: Cannot Resolve The Name 'xenc:EncryptedData' To A(n) 'element Declaration' Component.

我的验证/解组代码如下所示(使用moxy作为JAXB提供程序):

jaxbContext = JAXBContext.newInstance(type.getRequestType().getPackage().getName());
Unmarshaller um = jaxbContext.createUnmarshaller();

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(this.getClass().getResourceAsStream("/xsd/" + type.getXsdName())));
um.setSchema(schema);

root = um.unmarshal(new StreamSource(new ByteArrayInputStream(xmlData)), type.getRequestType());

在您询问该类型的作用之前:我编写的代码可以从http://www.forum-datenaustausch.ch/导入所有类型的发票。但4.3及更高版本使用另外两个模式文件。如何验证XML文件?

2 个答案:

答案 0 :(得分:4)

查看this post的已接受答案。基于我在你的帖子中看到的一点点,以及我记忆中的问题,你加载XSD的方式的问题与你按照自己的方式做的事实有关,工厂没有得到基础uri因此,它无法应用其智能来解析对其他两个XSD的引用。我必须假设您的另外两个XSD也作为资源打包在同一个jar中,位于同一目录中。

我必须承认我对错误消息很感兴趣,这似乎意味着它加载的模式是有效的,因此它可能是一个XML问题;如果以上内容对您没有帮助,那么您应该考虑发布有问题的XML ......

更新:根据我的评论,它按照描述工作。请参阅下面的代码段:

SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema compiledSchema = schemaFactory.newSchema(new SOTests().getClass()
    .getClassLoader().getResource("generalInvoiceRequest_430.xsd"));
Validator validator = compiledSchema.newValidator();
try {
    validator.validate(new StreamSource("D:\\...\\dentist_ersred_TG_430.xml"));
    System.out.println("Valid.");
}
catch (SAXException ex) {
    System.out.print("Not valid because..." + ex.getMessage());
}  

您不需要加载超过第一个XSD,并且您不应该加载,因为所有导入都提供了对架构位置的提示。

enter image description here

XSD文件在生成的jar中的同一目录中 all ,它们必须是,因为用于导入的相对URI表示相同的父级。

enter image description here

程序输出,其中一个文件是从here下载的:

Valid.

介绍无效内容后:

Not valid because...cvc-complex-type.2.4.a: Invalid content was found starting with element 'wrong'. One of '{"http://www.forum-datenaustausch.ch/invoice":processing}' is expected.

我建议读者:

  • 使用getResource()获取URL;正如我上面所说,StreamResource没有基URI,因此不能取消引用根据xsd:import schemaLocation属性的相对引用。
  • 当架构/工厂明确提供时,让架构/工厂为您进行加载。
  • 确保在提供时,相对引用与jar文件中的文件夹结构匹配。

答案 1 :(得分:-1)

这里有类似的问题。我尝试将GeneralInvoice导入集成软件。

  1. Parser不喜欢导入模式开头的DOCTYPE标记。解决方案:删除了DOCTYPE部分。
  2. Parser没有lke anyAttribute,anyURI等解决方案:将anyURI更改为字符串并通过发表评论来删除其他内容。
  3. 首先要导入xenc和xwldsig xsd,然后再导入GeneralInvoice。
  4. 希望这有帮助