如何使生成的类包含来自XML Schema文档的Javadoc
我目前正在处理大多数types和元素都有<xsd:annotation>
/ <xsd:documentation>
的XML模式。 当我从这个XML Schema生成Java Beans时,那些Bean的Javadoc只包含一些关于types/元素的允许内容的通用生成信息。
我希望在相关位置看到<xsd:documentation>
标记的内容(例如,为了表示该complexType而生成的类的Javadoc中将显示该types的标记的内容)。
有没有办法做到这一点?
编辑 :这个XML Schema将用于带有JAX-WS的WSDL,所以这个标签也可能是合适的。
编辑2 :我读过关于<jxb:javadoc>
。 根据我的理解,我可以在单独的JAXB绑定文件中指定,也可以直接在XML模式中指定。 这几乎可以解决我的问题。 但是我宁愿使用现有的<xsd:documentation>
标记,因为Javadoc不是文档的主要目标(主要是关于数据结构的信息,而不是关于由它生成的Java Bean的信息),并允许非JAXB工具也可以访问这些信息。 在<jxb:javadoc>
和xsd:documentation>
“感觉”是错误的,因为我没有很好的理由重复数据(和工作)。
编辑3 :感谢Pascal的回答,我意识到我已经有了一半的解决scheme: complexType
的<xsd:documentation>
被写入到它的Javadoc的开头! 问题仍然是只使用complexType
s和simpleType
s(这也可能导致类),而元素仍然是Javadoc-less。
我从来没有能够得到正常的xsd:documentation
被放置在Java源代码中,除非当且仅当它是复杂types。 元素,简单types等的文档被忽略。
所以,我最终使用jxb:javadoc
。 为此,请在<xsd:schema>
元素中包含xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
的定义。
将一个子项添加到<xsd:complexType>
或<xsd: element>
或<xsd:attribute>
:
<xsd:annotation><xsd:appinfo><jxb:XXX><jxb:javadoc> This is my comment for a class/property </jxb:javadoc></jxb:XXX></xsd:appinfo></xsd:annotation>
其中XXX是“阶级”或“财产”。
对于一个包你写一个孩子到xsd:schema
<xsd:annotation><xsd:appinfo><jxb:schemaBindings><jxb:package name="com.acme"><jxb:javadoc> This is my comment for a package </jxb:javadoc></jxb:package></jxb:schemaBindings></xsd:appinfo></xsd:annotation>
编写HTML文档需要用<![CDATA[ --- ]]>
(编辑:当写我的答案,这个问题已经由OP编辑,所以我相应地更新)
在我的情况下,javadoc是唯一的目标,所以使用jxb:javadoc
是可以接受的。 但是你的更新很有意义,其实我完全同意你的看法。 可悲的是,我从来没有find你描述的情况的理想解决scheme(所以我会非常仔细地跟踪这个问题)。 也许你可以使用xframe这样的东西从xsd:documentation
生成xsd:documentation
,但是这不能回答这个问题。
这对于JAXB参考实现来说是不可能的。 即使你试图编写一个XJC插件,你也会发现插件API没有引用Schema定义,所以没有办法提取这些信息。
我们唯一的希望是未来的JAXB版本可以解决这个问题。 这里有一个开放的function请求 。
我发现以下技术非常适合将JavaDoc头添加到Java元素类(从XML模式生成)。 我将JavaDoc嵌套在jax-b名称空间中定义的标记中,嵌套在xml模式注释和appinfo标记中。 请注意,jaxb名称空间定义了文档标签的types; 我使用其中的两个:类和属性标记。 在以下命名空间中定义:xmlns:jxb =“http://java.sun.com/xml/ns/jaxb”;
1)要logging一个类,我使用jaxb“class”标签按以下顺序:
<xs:complexType name="Structure"> <xs:annotation> <xs:appinfo> <jxb:class> <jxb:javadoc> Documentation text goes here. Since parsing the schema into Java involves evaluating the xml, I escape all the tags I use as follows <p> for <p>. </jxb:javadoc> </jxb:class> </xs:appinfo> </xs:annotation> . . . </xs:complexType>
2)要logging一个元素,我使用“财产”标签如下:
<xs:element name="description" type="rep:NamedString"> <xs:annotation> <xs:appinfo> <jxb:property> <jxb:javadoc> <p>Documentation goes here.</p> </jxb:javadoc> </jxb:property> </xs:appinfo> </xs:annotation> </xs:element>
3)我使用相同的一组标签来logging属性:
<xs:attribute name="name" type="xs:NCName" use="required"> <xs:annotation> <xs:appinfo> <jxb:property> <jxb:javadoc> <p>Documentation goes here.</p> </jxb:javadoc> </jxb:property> </xs:appinfo> </xs:annotation> </xs:attribute>
4)要logging一个select,我使用属性jaxb标记,并且loggingselect。
<xs:choice maxOccurs="unbounded"> <xs:annotation> <xs:appinfo> <jxb:property> <jxb:javadoc> <p>Documentation goes here.</p> </jxb:javadoc> </jxb:property> </xs:appinfo> </xs:annotation> <xs:element name="value" type="rep:NamedValue" /> <xs:element name="list" type="rep:NamedList" /> <xs:element name="structure" type="rep:NamedStructure" /> </xs:choice>
尝试logging这里的个人select将失败,因为这个标签产生一个无types的列表。