Я использую stax для анализа XML-строки в первый раз. Я нашел несколько примеров, но не могу заставить мой код работать. Это последняя версия моего кода:Чтение XML-строки с использованием 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);
}
}
}
Я положил часы на «событие» и «reader.getElementText()». Когда код останавливается на
String element = reader.getLocalName();
отображается «reader.getElementText()» значение, но как только он отходит от этой линии не может быть оценена. Когда код остановлен:
status = reader.getElementText();
Часы «элемента» отображают правильное значение. Наконец, когда я ступаю код более одной строки, я ловлю это исключение:
(com.ctc.wstx.exc.WstxParsingException) com.ctc.wstx.exc.WstxParsingException: Current state not START_ELEMENT
at [row,col {unknown-source}]: [1,29]
Я попытался с помощью status = reader.getText();
вместо этого, но я получаю это исключение:
(java.lang.IllegalStateException) java.lang.IllegalStateException: Not a textual event (END_ELEMENT)
Может кто-нибудь указать на то, что Я делаю неправильно?
EDIT:
Добавление кода JUnit, используемый для теста:
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();
}
}
Что искать ваши данные XML как? Вы уверены, что он хорошо сформирован? (Возможно, покажите нам небольшую сумму) –
XML - это ответ строки из другого класса/метода, который будет вызывать мой код. Я пишу JUnit для проверки парсера. Я добавил код JUnit к вопросу, включая метод, который генерирует XML для теста. – sdoca
моим личным подходом было бы найти учебник stAX и убедиться, что он работает для меня, а затем расширьте его, чтобы покрыть ваши требования. Я отмечаю, что вы только ловушки START_ELEMENT - я бы добавил '} else {' предложение, которое регистрирует другие события. Это расскажет вам, как далеко вы прошли данные. –