我想知道是否有使用jaxb从生成的xml中删除不需要的元素。我的xsd元素定义如下。
<xsd:element name="Title" maxOccurs="1" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
A name given to the digital record.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"></xsd:minLength>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
正如您所看到的那样,它不是必需元素,因为
的minOccurs = “0”
但如果它不是空的,则长度应为1。
<xsd:minLength value="1"></xsd:minLength>
在编组时,如果我将“标题”字段留空,则会抛出
SAXException 因为长度限制。
所以我想要做的是删除整个<Title/>
从生成的XML.Right现在我删除了最小长度限制,因此它将<Title>
元素添加为 EMPTY
<Title></Title>
但我不希望这样。感谢任何帮助。我正在使用jaxb 2.0进行编组。
更新
以下是我的变量定义:
private JAXBContext jaxbContext;
private Unmarshaller unmarshaller;
private SchemaFactory factory;
private Schema schema;
private Marshaller marshaller;
编组代码。
jaxbContext = JAXBContext.newInstance(ERecordType.class);
marshaller = jaxbContext.createMarshaller();
factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schema = factory.newSchema((new File(xsdLocation)));
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
ERecordType e = new ERecordType();
e.setCataloging(rc);
/**
* Validate Against Schema.
*/
marshaller.setSchema(schema);
/**
* Marshal will throw an exception if XML not validated against
* schema.
*/
marshaller.marshal(e, System.out);
答案 0 :(得分:3)
如果您将标题值设置为空字符串""
,它将生成<Title/>
,如果您将其设置为null
,则应该完全省略该元素。
答案 1 :(得分:0)
我正在利用XmlAdapter,实现了一个透明的适配器,如果Collection或String为空,它将返回封送处理null值。
public class XMLStringAdapter extends XmlAdapter<String, String> {
@Override
public String unmarshal(String v) throws Exception {
return v;
}
@Override
public String marshal(String v) throws Exception {
return v != null && v.isEmpty() ? null : v;
}
}
还添加package-info.java
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
})
your.package
https://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts006.htm