如何在JAXB中解组时忽略元素的属性

时间:2017-06-14 08:56:22

标签: java xml jaxb

我的XML看起来像这样

 <NMFIISERVICES>
        <service_status diffgr:id="service_status1" msdata:rowOrder="0" 
            diffgr:hasChanges="inserted">
            <service_return_code>0</service_return_code>
            <service_msg>Success</service_msg>
        </service_status>
 </NMFIISERVICES>

它出现以下错误

与元素类型“service_response”关联的属性“diffgr:id”的前缀“diffgr”未绑定。

我需要这种格式的xml

 <NMFIISERVICES>
        <service_status>
            <service_return_code>0</service_return_code>
            <service_msg>Success</service_msg>
        </service_status>
 </NMFIISERVICES>

在JAXB中解组时如何忽略上述 diffgr 属性

2 个答案:

答案 0 :(得分:0)

如果不映射属性,JAXB将自动忽略它。

您的异常来自JAXB使用的XML Parser,因为您的名称空间未声明,您的XML应该是:

<NMFIISERVICES xmlns:diffgr="http://some.namespace" xmlns:msdata="http://some.other.namespace">
    <service_status diffgr:id="service_status1" msdata:rowOrder="0" 
        diffgr:hasChanges="inserted">
        <service_return_code>0</service_return_code>
        <service_msg>Success</service_msg>
    </service_status>
</NMFIISERVICES>

如果无法更改XML,则需要解析它以在解组之前删除属性命名空间。

答案 1 :(得分:0)

您可以使用下面的解决方案

class XMLReaderWithoutNamespace extends StreamReaderDelegate {
    public XMLReaderWithoutNamespace(XMLStreamReader reader) {
      super(reader);
    }
    @Override
    public String getAttributeNamespace(int arg0) {
      return "";
    }
    @Override
    public String getNamespaceURI() {
      return "";
    }
}

InputStream is = new FileInputStream(filename);
XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(is);
XMLReaderWithoutNamespace xr = new XMLReaderWithoutNamespace(xsr);
Unmarshaller um = jc.createUnmarshaller();
Object res = um.unmarshal(xr);

它允许您用空字符串替换diffgr命名空间

请参阅here