如何通过jaxb从生成的XML中删除不需要的元素

时间:2012-09-03 08:36:50

标签: java xml jaxb marshalling unmarshalling

我想知道是否有使用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);

2 个答案:

答案 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

How can JAXB XmlAdapter be used to marshall lists?