2016-10-19 6 views
0

junitユニットテストでxmlファイルを検証しようとしています。これは私の単純化されたコードです。スキーマが原因に建設されていませんしかし、スキーマはhttp://www.unece.org/http://www.gs1.org/ユニットテストでxsd要素名が解決されていません

package test; 

import java.net.URL; 
import java.nio.file.Paths; 

import javax.xml.XMLConstants; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 

import org.junit.Assert; 
import org.junit.BeforeClass; 
import org.junit.Test; 

public class Epcis11MessageCreatorForSoTest { 

    private static Schema schema; 

    private final static String[] XSD_FILES = { 
      "epcis11/xsd/BasicTypes.xsd", 
      "epcis11/xsd/DocumentIdentification.xsd", 
      "epcis11/xsd/Partner.xsd", 
      "epcis11/xsd/Manifest.xsd", 
      "epcis11/xsd/BusinessScope.xsd", 
      "epcis11/xsd/StandardBusinessDocumentHeader.xsd", 
      "epcis11/xsd/EPCglobal.xsd", 
      "epcis11/xsd/EPCglobal-epcis-1_1.xsd", 
      "epcis11/xsd/EPCglobal-epcis-query-1_1.xsd", 
      "epcis11/xsd/EPCglobal-epcis-masterdata-1_1.xsd", 
    }; 

    @BeforeClass 
    public static void beforeClass() throws Exception { 
     try { 
      System.setProperty("jaxp.debug", "10"); 

      SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 

      Source[] sources = new Source[XSD_FILES.length]; 
      int i = 0; 
      for (String xsdfile : XSD_FILES) { 
       URL resource = Epcis11MessageCreatorForSoTest.class.getClassLoader().getResource(xsdfile); 
       String systemId = Paths.get(resource.toURI()).toFile().getAbsolutePath(); 
       StreamSource ss = new StreamSource(
         Epcis11MessageCreatorForSoTest.class.getClassLoader().getResourceAsStream(xsdfile),systemId); 

       sources[i] = ss; 
       i++; 
      } 
      schema = schemaFactory.newSchema(sources); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      throw e; 
     } 
    } 
    @Test 
    public void testFoo() { 
     Assert.assertTrue(true); 
    } 

} 

からアクセスできます。

ターゲット/テストクラス/ epcis11/XSD/EPCグローバル-EPCIS-1_1.xsd。 lineNumber:46; columnNumber:60; src-resolve: 'sbdh:StandardBusinessDocumentHeader'という名前を(n)要素宣言のコンポーネントに解決できません。

関連する行は、この(EPCグローバル-EPCIS-1_1.xsd)のように見える

<xsd:schema xmlns:epcis="urn:epcglobal:epcis:xsd:1" xmlns:sbdh="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:epcglobal="urn:epcglobal:xsd:1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:epcglobal:epcis:xsd:1" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="1.1"> 
... 
<xsd:import namespace="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" schemaLocation="./StandardBusinessDocumentHeader.xsd"/> 
... 
<xsd:element ref="sbdh:StandardBusinessDocumentHeader"/> 

私はIDEとしてEclipseを使用して、プロジェクトがJREシステムライブラリとして使用するJavaSE-1.7を使用しています。これらのxsdファイルを見ると、構文上問題ありません。つまり、私はideにXML関連のエラーはありません。テストがideまたはmavenのどちらから実行されても、まったく同じエラーが表示されます。

私のschemafactoryやxsdソースには、Javaオブジェクトとして何が間違っているかもしれないかについてのアドバイスはありますか?

+0

名前空間「sbdh」はどこに定義されていますか? –

+0

名前空間接頭辞 'sbdh'はEPCglobal-epcis-1_1.xsdにあります。上の行のスニペットがあります。 – user7040845

答えて

0

私はデバッガを使用して自分のコードを実行する時間がありました。それはかなり重いものでした。たとえば、com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.classには、100を超えるインポートと4000行以上のコードが含まれています。

xsd文法やスキーマやスキーマソースを読み込むcom.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLInputSource)にプログラミングエラーがあるとは思っています。我々の文脈。

http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader名前空間の最初に読み込まれる文法はBasicTypes.xsdです。

私の所見は、その文法がその名前空間によってマッピングされ、それが他のスキーマに含まれた後、何らかの形で名前空間、文法を共有するincluders 'が何らかの形で保護されていることです。私は、EPCglobal-epcis-1_1.xsdからBasicTypes.xsdで定義されている任意の型に参照できますが、http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader名前空間の他の要素または型を参照すると、ではありませんBasicTypes.xsdでを定義すると、名前解決エラーが発生します。

私の理論はそれによってバックアップされます。タイプ定義や要素宣言をBasicTypes.xsdに移動すると、EPCglobal-epcis-1_1.xsdからそのタイプまたは要素を参照できます。

実際には、このプロジェクトで使用されている名前空間http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeaderのすべての型定義と要素宣言を1つのxsdソースファイルに統合してから、スキーマを正しく構築できます。

しかし、検証に使用されるxsdファイルのどれも私によって維持されていないので、これは何らかのハックのように感じます。むしろ、自分のプロジェクトファイルからxmlスキーマを構築できるシステムを使用したいと思います。

+0

この問題に関連するバグは、Oracleによって承認されたバグです:http://bugs.java。com/bugdatabase/view_bug.do?bug_id = JDK-8168883 – user7040845

関連する問題