2010-12-13 2 views
1

Что я могу сделать, чтобы игнорировать теги и <body> в процессе unmarshall с помощью Castor?xml to java object using castor

Xml examole:

<?xml version="1.0" encoding="UTF-8"?> 
<envelope> 
    <header> 
    <message>consultaTelefonosVigentesSocios</message> 
    </header> 
    <body> 
    <datosTelefonosVigentesSocios> 
     <listaTelefonosVigentesSocios> 
     <nroInterlocutor>2000393451672</nroInterlocutor> 
     <nroContrato>S6125345450573001</nroContrato> 
     <nroTelefono>011-4454451-8293</nroTelefono> 
     <tipoTelefono>T</tipoTelefono> 
     <claseDireccion>Z001</claseDireccion> 
     <descClaseDireccion>Correspondencia</descClaseDireccion> 
     <marcaEstandar>X</marcaEstandar> 
     <nroInterlocutorAsociadoDomicilio>200053945351672</nroInterlocutorAsociadoDomicilio> 
     </listaTelefonosVigentesSocios> 
     <listaTelefonosVigentesSocios> 
     <nroInterlocutor>200053435391672</nroInterlocutor> 
     <nroContrato>S612535430573001</nroContrato> 
     <nroTelefono>011-44453551-8299</nroTelefono> 
     <tipoTelefono>T</tipoTelefono> 
     <claseDireccion>Z001</claseDireccion> 
     <descClaseDireccion>Correspondencia</descClaseDireccion> 
     <marcaEstandar/> 
     <nroInterlocutorAsociadoDomicilio>20005543391672</nroInterlocutorAsociadoDomicilio> 
     </listaTelefonosVigentesSocios> 
     </datosTelefonosVigentesSocios> 
    </body> 
    <fault> 
    <faultactor>servicios.page:consultaTelefonosVigentesSocios</faultactor> 
    </fault> 
</envelope> 

касторовое отображение файла:

<?xml version="1.0"?> 
<mapping> 

<class 
    name="ar.com.telefonosSocioByNroContratoService.backend.service.TelefonosVigentesSocios"> 
    <map-to xml="datosTelefonosVigentesSocios" /> 
    <field name="listaTelefonosVigentesSocios" 
    type="ar.com.telefonosSocioByNroContratoService.backend.service.TelefonoVigenteSocio" 
    collection="arraylist"> 
    <bind-xml name="listaTelefonosVigentesSocios" /> 
    </field> 
</class> 

<class 
    name="ar.com.telefonosSocioByNroContratoService.backend.service.TelefonoVigenteSocio"> 
    <map-to xml="listaTelefonosVigentesSocios" /> 
    <field name="nroInterlocutor" type="java.lang.String"> 
    <bind-xml name="nroInterlocutor" node="element" /> 
    </field> 
    <field name="nroContrato" type="java.lang.String"> 
    <bind-xml name="nroContrato" node="element" /> 
    </field> 
    <field name="nroTelefono" type="java.lang.String"> 
    <bind-xml name="nroTelefono" node="element" /> 
    </field> 
    <field name="tipoTelefono" type="java.lang.String"> 
    <bind-xml name="tipoTelefono" node="element" /> 
    </field> 
    <field name="marcaEstandar" type="java.lang.String"> 
    <bind-xml name="marcaEstandar" node="element" /> 
    </field> 
    <field name="descClaseDireccion" type="java.lang.String"> 
    <bind-xml name="descClaseDireccion" node="element" /> 
    </field> 
    <field name="nroInterlocutorAsociadoDomicilio" type="java.lang.String"> 
    <bind-xml name="nroInterlocutorAsociadoDomicilio" node="element" /> 
    </field> 
</class> 
</mapping> 

тест:

public class TelefonosSocioByNroContratoServiceTest { 

@Test 
public void testUsuarioIntranetListfromXML() throws Exception{ 
    Mapping mapping= new Mapping(); 
    ClassPathResource mappingResource = 
    new ClassPathResource("/ar/com/telefonosSocioByNroContratoService/backend/service/telefonosVigenteSocios.map.xml"); 

     mapping.loadMapping(mappingResource.getURL()); 
     ClassPathResource inputExample= new ClassPathResource("ar/com/test/castor/consultaTelefonosVigentesSocios.xml"); 
     Reader reader = new FileReader(inputExample.getFile()); 

     Unmarshaller unmarshaller = new Unmarshaller(TelefonosVigentesSocios.class); 
     unmarshaller.setMapping(mapping); 
     TelefonosVigentesSocios telefonosVigentesSocios = (TelefonosVigentesSocios) unmarshaller.unmarshal(reader); 
     reader.close(); 
     Assert.assertNotNull(telefonosVigentesSocios); 
     Assert.assertNotNull(telefonosVigentesSocios.getListaTelefonosVigentesSocios()); 
     Assert.assertTrue("se esperaba not empty telefonos",!telefonosVigentesSocios.getListaTelefonosVigentesSocios().isEmpty()); 
} 
} 

ответ

1

Вместо того, чтобы использовать входной поток, вы могли бы использовать XMLStreamReader (StAX) как ваш вход. Затем продвигайте XMLStreamReader к событию начального элемента для контента, на который вы сопоставили. Затем отмените Castor от XMLStreamReader.

Если Castor не поддерживает StAX, то я могу показать вам, как это сделать с JAXB. Я возглавляю реализацию EclipseLink JAXB (MOXy).