在我的xsd中我有元素
<xs:element name="MyDateElement" type="MyDateElementType" nillable="true" />
<xs:complexType name="MyDateElementType">
<xs:simpleContent>
<xs:extension base="xs:date">
<xs:attribute name="state" type="xs:string" />
<xs:attribute name="dateFrom" type="xs:date" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
我正在使用
<artifactId>cxf-codegen-plugin</artifactId>
从wsdl生成java类。
所以这个插件生成了这个java类:
public class ParrentClass
implements Serializable
{
@XmlElement(name = "MyDateElement", required = true, nillable = true)
protected MyDateElementType MyDateElement;
// setter and getter
}
public class MyDateElement
implements Serializable
{
@XmlValue
protected Date value;
@XmlAttribute(name = "state")
protected String state;
@XmlAttribute(name = "dateFrom")
protected Date dateFrom;
// setter and getter
}
我认为这仍然可以。
所以现在当我创建具有null值的元素并且只使用属性
时protected MyDateElement getDatumStav(String state) {
MyDateElement element = new MyDateElement();
element.setState(state);
return element;
}
JAXB创建无效的xml:
<ns:MyDateElement stav="S"></ns:MyDateElement>
(缺少nillable = true)
所以任何人都可以帮助我如何解决这个问题。
PS:
我知道在xsd中我允许minOccurs=0
然后插件生成包含JAXBElement<MyDateElement>
的java类,我可以手动设置nillable
。但我想避免这种解决方案,因为这个元素是必需的
答案 0 :(得分:-2)
您可以使用JDOM2将其添加到java类中:
例如:
Namespace ns0 = Namespace.getNamespace("ns0", "http://...");
Namespace xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
SAXBuilder jdomBuilder = new SAXBuilder();
InputStream stream = new ByteArrayInputStream(xmlFileString.getBytes("UTF-8"));
Document jdomDocument = jdomBuilder.build(stream);
Element root = jdomDocument.getRootElement();
Element agreement = root.getChild("Agreement", ns0);
Element co = agreement.getChild("CoOwner", ns0);
if (co.getText().equals(""))
{
co.setAttribute("nil", "true", xsi);
}
// Return to string
return new XMLOutputter().outputString(jdomDocument);
输出:
<ns0:CoOwner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />