代码之家  ›  专栏  ›  技术社区  ›  Newtopian

在生成的代码中,如何访问XSD文件中声明的方面?

  •  4
  • Newtopian  · 技术社区  · 15 年前

    我以为这是个简单的问题,结果却让人头疼。

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

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

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

    谢谢

    2 回复  |  直到 12 年前
        1
  •  4
  •   Charles Hellstrom    14 年前

    我面临着一个类似的问题,我找到的最佳解决方案是编写自己的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;
    

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

    创建插件的文档不是很好,但我发现了 article 有用的。看看源代码 Default Value Plugin 了解如何深入到XJC在内存中表示的XML模式和生成的类结构。这个 JAXB , XSOM CodeModel API也会有所帮助。

        2
  •  1
  •   Gabber    12 年前

    看起来XSD包含语义“指南”,而不是清晰的规则。imho如果同意XSD,不遵守它会导致违反。

    如果不是这样的话,并且XSD包含一些需要解释的指导原则,我会花时间理解XSD解析API,并尝试以这种方式解决问题。在这里再发明轮子没用。

    但是,我会质疑所采用的方法,并尝试在XSD内部就清晰的规则达成一致。