使用 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
中的选项,例如:
但结果是一样的..
那里有什么问题?
【问题讨论】:
也许问题在于您的 XSD 基本上是一个 XML 文件 - 其中字符&lt;
是不允许的,必须转义为 &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="<"/>
<enumeration value="<="/>
<enumeration value=">"/>
<enumeration value=">="/>
</restriction>
</simpleType>
这与您显示的完全不同,实际上任何 XML 文档都不能具有未转义的 &lt;
登录属性值。
我不知道xjc
,但我猜它不会抱怨您链接到的真实架构以原始形式保存,有人可能错误地将浏览器的“漂亮打印”渲染保存为全选->复制 -> 粘贴,已知不会保留原始标记。
【讨论】:
谢谢。那么问题实际上是 xsd 文件本身。您更喜欢将 xsd 文件正确地放入本地,而不是仅仅“复制和粘贴”,因为它看起来不是最佳实践。 @OnurGürdoğan,不,XSD 没有问题,只需将其保存(例如,如果您将其加载到 Chrome 的浏览器窗口中,请右键单击 -> 另存为以将其保存到本地文件。该本地文件将具有格式正确的标记(例如<enumeration value="&lt;"/>
)。我不知道您使用的工具(xjc
)是否也只允许您针对HTTPS URI运行,但您当然可以尝试例如xjc https://www.omg.org/spec/XTCE/20180204/SpaceSystem.xsd
。问题是漂亮的打印机浏览器倾向于用来呈现 XML 并不能显示原始标记,所以这就是为什么 &lt;
最终会变成 &lt;
。以上是关于使用 XJC 进行 XSD 模式解析的主要内容,如果未能解决你的问题,请参考以下文章
Maven Xjc / Jaxb插件无法解析简单的Xsd文件
JAXB XJC 代码生成 - Marshaller 生成的 xml 中缺少“schemaLocation”