2013-03-25 72 views
1

我想验证XML文件对this schema(即在zip中);它会导入两个其他XSD文件。如何使用导入另一个模式文件的模式文件验证XML?

<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文件?

回答

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文件在生成的罐子相同目录下的所有,而且必须的,因为用于进口相对的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文件中的文件夹结构相匹配。
+0

两个的XSD并给出了XML,并都是从同一个“官方”源http://www.forum-datenaustausch.ch/。所以在xsd或xml中很可能没有问题。 但是在你引用的文章中,我发现该模式工厂可能需要多个xsd - 我认为这就是解决方案。我会尽力。 – dermoritz 2013-03-26 08:07:44

+0

我只是试图加载模式工厂中的所有模式,但错误仍然存​​在。另一方面,如果我尝试验证xml在线,我得到了同样的错误 - 所以我不知道模式是否加载并正确使用?! – dermoritz 2013-03-26 10:07:05

+0

@dermoritz,您是否按照文章中描述的方式进行了尝试,并且您是否已将*所有* XSD放入您的jar中的相同文件夹中? – 2013-03-26 12:37:29

-1

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

  1. 解析器不喜欢导入模式开始时的DOCTYPE标记。解决方案:删除DOCTYPE部分。
  2. 解析器没有lke anyAttribute,anyURI等解决方案:将anyURI更改为字符串,并通过发表评论来删除其他内容。
  3. 必须先导入xenc和xwldsig xsd,然后在第二步导入GeneralInvoice。

希望这有助于

相关问题