Lesen von XML-String mit StAX

Bin ich mit dem stax das erste mal zu analysieren, eine XML-Zeichenfolge. Ich fand einige Beispiele, aber nicht mein code, um zu arbeiten. Dies ist die neueste version von meinem code:

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);
        }
    }
}

Ich habe Uhren auf "Ereignis" und "Leser.getElementText()". Wenn der code wird angehalten, auf

String element = reader.getLocalName();

den "Leser.getElementText ()" - Wert angezeigt, aber sobald Sie bewegt sich Weg von dieser Linie, so kann nicht ausgewertet werden. Wenn der code gestoppt:

status = reader.getElementText();

den "element" - Uhr zeigt den richtigen Wert. Schließlich, wenn ich den code eine Zeile mehr, die ich diese Ausnahme abfangen:

(com.ctc.wstx.exc.WstxParsingException) com.ctc.wstx.exc.WstxParsingException: Current state not START_ELEMENT
 at [row,col {unknown-source}]: [1,29]

Ich habe versucht, mit status = reader.getText(); statt, aber dann bekomme ich diese exception:

(java.lang.IllegalStateException) java.lang.IllegalStateException: Not a textual event (END_ELEMENT)

Kann jemand erklären, was ich falsch mache??

EDIT:

Hinzufügen JUnit-code zum testen verwendet:

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();
    }
}
Was macht Ihr XML-Daten Aussehen? Sind Sie sicher, dass es wohlgeformt ist? (Vielleicht zeigen Sie uns einen kleinen Betrag)
Die XML ist eine Zeichenfolge, die Antwort von einer anderen Klasse/Methode, dass mein code aufrufen wird. Ich Schreibe ein JUnit-test der parser. Ich habe die JUnit-code zu der Frage, einschließlich der Methode, die die XML generiert für den test.
mein persönlicher Ansatz wäre, zu finden, ein stAX-tutorial und stellen Sie sicher, dass es für mich funktioniert, dann verlängern Sie es um Ihre Anforderungen zu umfassen. Ich beachten Sie, dass Sie nur trap START_ELEMENT - ich würde eine } else { - Klausel, die logs der anderen Ereignisse. Das wird Ihnen sagen, wie weit Sie es geschafft haben, durch die Daten.

InformationsquelleAutor sdoca | 2011-01-10

Schreibe einen Kommentar