如何通过JAXB编组来删除生成的XML中的Namespace和Nillable属性

时间:2014-05-13 07:16:24

标签: xml jaxb marshalling

我有以下XSD文件: -

   <?xml version="1.0" encoding="UTF-8"?>
   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="emp" targetNamespace="emp"
   elementFormDefault="qualified">
  <xs:element name="root">
   <xs:complexType>
   <xs:sequence>
    <xs:element maxOccurs="unbounded" ref="Case_Detail" minOccurs="0"/>
   </xs:sequence>
   </xs:complexType>
   </xs:element>
  <xs:element name="Case_Detail">
   <xs:complexType>
  <xs:sequence>
    <xs:element ref="Central_Case_ID"/>
    <xs:element ref="Agency_Case_ID"/>
     </xs:sequence>
    </xs:complexType>
    </xs:element>
   <xs:element name="Central_Case_ID">
    <xs:simpleType>
    <xs:restriction base="xs:string">
    <xs:maxLength value="20"/>
    </xs:restriction>
    </xs:simpleType>
    </xs:element>
     <xs:element name="Agency_Case_ID">
   <xs:simpleType>
     <xs:restriction base="xs:string">
    <xs:maxLength value="50"/>
    </xs:restriction>
    </xs:simpleType>
  </xs:element>  
    </xs:schema>

我已经生成了JAXB类并试图编组到XML文件中。在生成的XML文件中,我可以为XML文件中的每个元素提供属性,如果它是null,则: 对于例如: -

<Central_Case_ID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

我的要求是拥有没有这些属性的元素,即使某个元素在enitre XML文件中具有空值。为此,我尝试了很多,我在XSD中做了很多更改,比如更新的elementFormDefault =&#34;不合格&#34;和arguementFormDefault到unqalified但它没有工作。然后我在JAXB类中对@annotations进行了更改,并尝试在编组对象中设置一些属性,如No_Namespace_schema_location但没有任何效果。

请建议。

1 个答案:

答案 0 :(得分:1)

Java模型

我使用XJC从XML Schema生成了默认的Java模型。

演示代码

<强>演示

下面的演示代码填充对象模型(将centralCaseID属性设置为null)并将其编组为XML。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("emp");

        ObjectFactory objectFactory = new ObjectFactory();
        Root root = objectFactory.createRoot();

        CaseDetail caseDetail = objectFactory.createCaseDetail();
        caseDetail.setCentralCaseID(null);
        root.getCaseDetail().add(caseDetail);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

<强>输出

以下是运行演示代码的输出。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns="emp">
    <Case_Detail/>
</root>

需要注意的事项: