4

我原以为会是一个简单的问题,结果却是一个令人头疼的问题。

我目前正在使用 JAXB 2 从我无法控制的 XSD 生成代码。我需要从模式中访问约束,以便在这些对象中设置值时应用一些逻辑和保护代码。批量验证根本行不通。在大多数情况下,我可以简单地截断字符串,一切都会好起来的。为此,我需要获取在 XSD 中声明的长度,以便在保护代码中应用它并保持这一层的通用性。另一种方法是复制和硬编码长度,但坦率地说,如果有更好的方法来做到这一点,我将不胜感激。

我在这里说的是字符串长度,但这适用于 XSD 中可声明的所有方面。

欢迎提出建议、代码示例和链接,基本上任何可以帮助我不在类中对数据进行硬编码的东西。

谢谢

4

2 回答 2

4

我遇到了类似的问题,我发现最好的解决方案是编写自己的 XJC 插件。XJC 插件可以访问 XML 模式和生成的类,因此它似乎是获取限制信息的最简单方法。我的插件向生成的类中的任何字段添加了注释,这些字段在模式中对其应用了限制。例如,像这样的元素

<xs:element name="text">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:maxLength value="20" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

会显示为

@XmlRestrictions(maxLength = 20)
protected String text;

在生成的类文件中。然后,您可以使用反射从字段中提取限制信息。

创建插件的文档不是很好,但我发现这篇文章很有用。查看默认值插件的源代码,了解如何深入了解 XJC 的 XML 模式和生成的类结构的内存表示。JAXB、XSOM和CodeModel API 也会很有帮助

于 2010-07-21T19:32:18.087 回答
1

看起来 XSD 包含语义“指南”而不是明确的规则。恕我直言,如果同意 XSD,不遵守它会导致违规。

如果不是这种情况,并且 XSD 包含需要解释的指南,我会花时间了解 XSD 解析 API 并尝试以这种方式解决问题。在这里重新发明轮子没有用。

然而,我会质疑所采取的方法,并尝试就 XSD 内的明确规则达成一致。

于 2012-08-13T11:20:13.677 回答