gpt4 book ai didi

java - JAXB:获取错误 "Cannot resolve the name xxx to a(n) ' 类型定义'组件。”

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:22 24 4
gpt4 key购买 nike

我正在尝试使用 JAXB 解码一些 XML,但似乎收到错误“无法将名称 xxx 解析为 (n) '类型定义'组件。”当我点击包含 sf.newSchema(...) 的行时:

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 ...)设法解决了该问题。

有人知道目录的程序化等价物是什么吗?

最佳答案

我遇到了类似的问题,因为我的 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);

关于java - JAXB:获取错误 "Cannot resolve the name xxx to a(n) ' 类型定义'组件。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com