Estoy usando stax por primera vez para analizar una cadena XML. He encontrado algunos ejemplos pero no puedo hacer que mi código funcione. Esta es la última versión de mi código:Leer cadena XML usando StAX
public class AddressResponseParser
{
private static final String STATUS = "status";
private static final String ADDRESS_ID = "address_id";
private static final String CIVIC_ADDRESS = "civic_address";
String status = null;
String addressId = null;
String civicAddress = null;
public static AddressResponse parseAddressResponse(String response)
{
try
{
byte[] byteArray = response.getBytes("UTF-8");
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream);
while (reader.hasNext())
{
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT)
{
String element = reader.getLocalName();
if (element.equals(STATUS))
{
status = reader.getElementText();
continue;
}
if (element.equals(ADDRESS_ID))
{
addressId = reader.getText();
continue;
}
if (element.equals(CIVIC_ADDRESS))
{
civicAddress = reader.getText();
continue;
}
}
}
}
catch (Exception e)
{
log.error("Couldn't parse AddressResponse", e);
}
}
}
He puesto relojes de "evento" y "reader.getElementText()". Cuando el código se detuvo en
String element = reader.getLocalName();
se muestra el valor "reader.getElementText()", pero en cuanto se aleja de esa línea no se puede evaluar. Cuando se detiene el código:
status = reader.getElementText();
el reloj "element" muestra el valor correcto. Finalmente, cuando me paso el código de una línea más, esta captura de excepción:
(com.ctc.wstx.exc.WstxParsingException) com.ctc.wstx.exc.WstxParsingException: Current state not START_ELEMENT
at [row,col {unknown-source}]: [1,29]
He intentado usar status = reader.getText();
lugar, pero luego me sale esta excepción:
(java.lang.IllegalStateException) java.lang.IllegalStateException: Not a textual event (END_ELEMENT)
Puede alguien señalar lo Estoy haciendo mal?
EDIT:
Adición de código JUnit utilizado para la prueba:
public class AddressResponseParserTest
{
private String status = "OK";
private String address_id = "123456";
private String civic_address = "727";
@Test
public void testAddressResponseParser() throws UnsupportedEncodingException, XMLStreamException
{
AddressResponse parsedResponse = AddressResponseParser.parseAddressResponse(this.responseXML());
assertEquals(this.status, parsedResponse.getStatus());
assertEquals(this.address_id, parsedResponse.getAddress()
.getAddressId());
assertEquals(this.civic_address, parsedResponse.getAddress()
.getCivicAddress());
}
private String responseXML()
{
StringBuffer buffer = new StringBuffer();
buffer.append("<response>");
buffer.append("<status>OK</status>");
buffer.append("<address>");
buffer.append("<address_id>123456</address_id>");
buffer.append("<civic_address>727</civic_address>");
buffer.append("</address>");
buffer.append("</response>");
return buffer.toString();
}
}
¿Qué datos XML se parecen? ¿Estás seguro de que está bien formado? (Quizás nos muestre una pequeña cantidad) –
El XML es una respuesta de Cadena de otra clase/método que mi código llamará. Estoy escribiendo un JUnit para probar el analizador. Agregué el código JUnit a la pregunta, incluido el método que genera el XML para la prueba. – sdoca
mi enfoque personal sería encontrar un tutorial stAX y asegurarme de que funciona para mí, luego extenderlo para cubrir sus necesidades. Recuerdo que solo atrapaste START_ELEMENT. Agregaría una cláusula '} else {' que registra los otros eventos. Eso te dirá qué tan lejos has llegado a través de los datos. –