我使用JAXB来使用这个API来方便地使用XJC(XML-to-Java)编译器通过命名引用从XML Schema生成的对象模型.它抽象了JAXB上下文的创建,并通过各种背景魔法和反射找到了ObjectFactory方法.它的基本要点是你总是定义一个通用模式,然后任何数字(也可能是0)模式"扩展"一般模式,每个模式产生自己的数据模型.通用模式带有可重用的定义,扩展它的定义使用它们来组成自己的模型.
我现在遇到了我想为多个项目重用通用模式的情况.一般类型定义应该在项目中保持相同,并且一些代码将针对从这些类生成的抽象类构建.所以我需要先为一些通用模式生成类,然后生成那些扩展并单独使用它们的类.我正在使用Maven进行构建过程.
我遇到的问题是从扩展模式中的通用模式解析类型定义.
假设我的通用模式名为"general.xsd",如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foobar.com/general"
xmlns:gen="http://www.foobar.com/general"
elementFormDefault="qualified" attributeFormDefault="qualified">
<!-- Element (will usually be root) -->
<xs:element name="transmission" type="gen:Transmission" />
<!-- Definition -->
<xs:complexType name="Transmission" abstract="true">
<xs:sequence>
<!-- Generic parts of a transmission would be in here... -->
</xs:sequence>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
接下来是一个绑定文件来做一些命名自定义并设置输出的包名称:
<?xml version="1.0" encoding="UTF-8"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
version="2.1">
<!-- Bindings for the general schema -->
<bindings schemaLocation="general.xsd" node="/xs:schema">
<schemaBindings>
<package name="com.foobar.models.general"/>
</schemaBindings>
<bindings node="//xs:complexType[@name='Transmission']">
<!-- Some customization of property names here... …Run Code Online (Sandbox Code Playgroud) 我有一个maven项目A,在它的classpath中有/xsd/a.xsd.我还有一个带有/xsd/b.xsd的项目B,它通过商品引用/xsd/a.xsd.商品目录如下所示:
PUBLIC "http://foo.org/a" "maven:org.foo:a:jar::!/xsd/a.xsd"
Run Code Online (Sandbox Code Playgroud)
请注意网址中的maven协议.org.jvnet.jaxb2.maven2:maven-jaxb22-plugin使用该目录生成带有依赖项集的JAXB带注释的Java类.
到目前为止一切都很好.
现在我想在Eclipse中编辑/xsd/b.xsd.Eclipse报告警告:
<xsd:import namespace="http://foo.org/a" />
Run Code Online (Sandbox Code Playgroud)
因为没有schemaLocation属性它找不到/xsd/a.xsd.Eclipse无法识别上面定义的商品.
找到的解决方法是在Eclipse/Window/Preferences/XML/XML Catalog中添加一个目录条目:
PUBLIC "http://foo.org/a" "jar:file:/home/alain/maven/repository/org/foo/a/1.0-SNAPSHOT/a-1.0-SNAPSHOT.jar!/xsd/a.xsd"
Run Code Online (Sandbox Code Playgroud)
请注意对本地存储库的引用(maven是.m2的链接)和依赖项目的特定版本a.
任何人都遇到过这个问题并找到了更好的解决方法?
您可以使用XMLCatalog解析模式导入语句中的xsds吗?如果是这样,首选/最佳做法是什么?我想在一个jar中打包xsds,所以使用相对schemaLocation不起作用.
到目前为止,我正在尝试做类似的事情:
SchemaFactory factory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
XMLCatalogResolver catalogResolver = new XMLCatalogResolver(
new String[]{"/path/to/catalog.xml"});
factory.setResourceResolver(catalogResolver);
Schema schema = factory.newSchema(new StreamSource(ClassLoader
.getSystemResourceAsStream("config.xsd")));
Run Code Online (Sandbox Code Playgroud)
没有太多运气.
我下载了SaxonHE9-4-0-6J并希望在CLI上处理XHTML.然而,Saxon试图从W3C加载DTD,并且每个简单的命令都需要花费太多时间.
我有xml目录,我通过设置env变量指向目录文件成功使用xmllint,但我不知道如何让Saxon使用它.谷歌揭示了使用撒克逊目录的变化(因此混乱)的整个历史,没有一个让我高兴.
我下载了resolver.jar并将其设置在我的CLASSPATH中,但我不能让Saxon使用它.经过各种组合之后,我只使用了目录变量来跟踪http://www.saxonica.com/documentation/sourcedocs/xml-catalogs.xml,例如:
-catalog:path-to-my-catalog
(尝试都URI和常规路径),和不设定-r,-x,-y开关,但撒克逊不会看到它.我收到此错误:
查询处理失败:无法加载Apache目录解析程序库
resolver.jar在我的类路径中设置,我可以从命令行使用它:
C:\temp>java org.apache.xml.resolver.apps.resolver
Usage: resolver [options] keyword
Where:
-c catalogfile Loads a particular catalog file.
-n name Sets the name.
-p publicId Sets the public identifier.
-s systemId Sets the system identifier.
-a Makes the system URI absolute before resolution
-u uri Sets the URI.
-d integer Set the debug level.
keyword Identifies the type of resolution to perform:
doctype, document, entity, notation, public, system,
or …Run Code Online (Sandbox Code Playgroud) xmlcatalog ×4
jaxb ×2
xml ×2
dtd ×1
eclipse-wtp ×1
java ×1
jaxb-episode ×1
m2e-wtp ×1
maven ×1
saxon ×1
schema ×1
validation ×1
xjc ×1