如何使生成的类包含来自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 &lt;p&gt; 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> &lt;p&gt;Documentation goes here.&lt;/p&gt; </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> &lt;p&gt;Documentation goes here.&lt;/p&gt; </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> &lt;p&gt;Documentation goes here.&lt;/p&gt; </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的列表。