2011-07-18 29 views
1

XMLを非整列化するためにJAXBを使用しようとしていますが、「名前のxxxを型定義 'コンポーネントに解決できません」というエラーが表示されるようです。私はsf.newSchema(...)を含む行を打ったとき:JAXB: "名前xxxを(n) '型定義'コンポーネントに解決できません。

JAXBContext jc = JAXBContext.newInstance("some.package.name"); 

Unmarshaller unmarshaller = jc.createUnmarshaller(); 

SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); 

Collection<Source> sources = new ArrayList<Source>(); 

sources.add(new StreamSource(new File("dog.xsd"))); 
sources.add(new StreamSource(new File("cat.xsd"))); 
sources.add(new StreamSource(new File("cow.xsd"))); 
sources.add(new StreamSource(new File("horse.xsd"))); 
sources.add(new StreamSource(new File("mouse.xsd"))); 

Schema schema = sf.newSchema(sources.toArray(new Source[0])); // SAXParseException thrown here 
unmarshaller.setSchema(schema); 

unmarshaller.unmarshal(socket.getInputStream()); 

例外トレースは次のようになります。

org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'xxx:xxx' to a(n) 'type definition' component. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) 
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2537) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2528) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getGlobalDecl(XSDHandler.java:1396) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseSimpleContent(XSDComplexTypeTraverser.java:373) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseComplexTypeDecl(XSDComplexTypeTraverser.java:249) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDComplexTypeTraverser.traverseGlobal(XSDComplexTypeTraverser.java:160) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.traverseSchemas(XSDHandler.java:1255) 
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:579) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:519) 
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:485) 
    at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:211) 
    ... 

私はXJCコンパイラを使用したとき、私は同じ問題を持っていました上記の各XSDからソースを生成しますが、カタログ(xjc -catalog ...)を使用して問題を解決することができました。

カタログのプログラムに相当するものは誰でも知っていますか?

+0

「SAXParseException」の詳細メッセージは何ですか? XSDファイルはどのように見えるのですか? –

+0

"xxx"はいずれのスキーマにも表示されますか? –

+0

"プログラム的にカタログに相当する"はおそらくEntityResolverです。 –

答えて

1

XSDが別のXSDをインポートしていたため、同様の問題が発生しました。それを解決する方法は、インポートされたすべてのXSDを取得し、スキーマを構築することです。

InputStream imported2Schema = ...getResourceAsStream("/com/path/to/Imported2.xsd"); 
Source imported2Source = new StreamSource(imported2Schema); 
InputStream imported1Schema = ...getResourceAsStream("/com/path/to/Imported1.xsd"); 
Source imported1Source = new StreamSource(imported1Schema); 
InputStream metadataSchema = ...getResourceAsStream("/com/path/to/metadata.xsd"); 
Source metadataSource = new StreamSource(metadataSchema); 
Source[] schemaSources = new Source[] {imported2Source, imported1Source, metadataSource}; 
Schema schema = sf.newSchema(schemaSources); 
関連する問題