使用 XJC 进行 XSD 模式解析

Posted

技术标签:

【中文标题】使用 XJC 进行 XSD 模式解析【英文标题】:XSD Schema Parsing with XJC 【发布时间】:2021-11-14 10:58:06 【问题描述】:

我一直在尝试解析 xsd 文件以便能够在本地生成 jaxb 文件。为此,我在 linux 上使用了xjc 命令,而命令本身没有任何选项。

但即使是我也非常基本地使用它:

xjc SpaceSystem.xsd

它给出如下错误:

ogurdogan@ogurdogan:~/Documents/XTCE/XJC Test$ xjc SpaceSystem.xsd  parsing a schema... [ERROR] The value of attribute "value" associated with an element type "enumeration" must not contain the '<' character. line 4399 of file:/home/ogurdogan/Documents/XTCE/XJC%20Test/SpaceSystem.xsd

可以在下面的第 11 行看到发生错误的定义。

<simpleType name="ComparisonOperatorsType">
 <annotation>
  <documentation xml:lang="en">Operators to use when testing a boolean condition for a validity check</documentation>
 </annotation>
 <restriction base="string">
  <enumeration value="=="/>
  <enumeration value="!="/>
  <enumeration value="<"/>
  <enumeration value="<="/>
  <enumeration value=">"/>
  <enumeration value=">="/>
 </restriction>
</simpleType>

即使我一直使用的 xsd 模式是来自here 的非常通用和正式的模式,它也会产生如上所示的错误。由于它是默认架构,不应更改,我不知道我需要做什么..

经过一番折腾,我也尝试使用xjc中的选项,例如:

-nv -扩展

但结果是一样的..

那里有什么问题?

【问题讨论】:

也许问题在于您的 XSD 基本上是一个 XML 文件 - 其中字符 &amp;lt; 是不允许的,必须转义为 &amp;lt; 【参考方案1】:

当我在第 4397 行查看链接架构的来源(例如 Chrome 中的 view-source:https://www.omg.org/spec/XTCE/20180204/SpaceSystem.xsd)时,我发现

<simpleType name="ComparisonOperatorsType">
    <annotation>
        <documentation xml:lang="en">Operators to use when testing a boolean condition for a validity check</documentation>
    </annotation>
    <restriction base="string">
        <enumeration value="=="/>
        <enumeration value="!="/>
        <enumeration value="&lt;"/>
        <enumeration value="&lt;="/>
        <enumeration value=">"/>
        <enumeration value=">="/>
    </restriction>
</simpleType>

这与您显示的完全不同,实际上任何 XML 文档都不能具有未转义的 &amp;lt; 登录属性值。

我不知道xjc,但我猜它不会抱怨您链接到的真实架构以原始形式保存,有人可能错误地将浏览器的“漂亮打印”渲染保存为全选->复制 -> 粘贴,已知不会保留原始标记。

【讨论】:

谢谢。那么问题实际上是 xsd 文件本身。您更喜欢将 xsd 文件正确地放入本地,而不是仅仅“复制和粘贴”,因为它看起来不是最佳实践。 @OnurGürdoğan,不,XSD 没有问题,只需将其保存(例如,如果您将其加载到 Chrome 的浏览器窗口中,请右键单击 -> 另存为以将其保存到本地文件。该本地文件将具有格式正确的标记(例如&lt;enumeration value="&amp;lt;"/&gt;)。我不知道您使用的工具(xjc)是否也只允许您针对HTTPS URI运行,但您当然可以尝试例如xjc https://www.omg.org/spec/XTCE/20180204/SpaceSystem.xsd。问题是漂亮的打印机浏览器倾向于用来呈现 XML 并不能显示原始标记,所以这就是为什么 &amp;lt; 最终会变成 &amp;lt;

以上是关于使用 XJC 进行 XSD 模式解析的主要内容,如果未能解决你的问题,请参考以下文章

Maven Xjc / Jaxb插件无法解析简单的Xsd文件

使用xjc从多个xsd文件生成Java

JAXB XJC 代码生成 - Marshaller 生成的 xml 中缺少“schemaLocation”

xjc 和 XSD 的选择

JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?

JDK Tools - xjc: 将 XML Schema 编译成 Java 类