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();
}
}
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine Lösung, die verwendet XMLEventReader statt XMLStreamReader:
Ich wäre immer noch daran interessiert, dass eine Lösung mit XMLStreamReader.
InformationsquelleAutor sdoca
Stellen Sie sicher, Lesen Sie javadocs für Stax: da ist es voll streaming Parser-Modus, werden nur die Informationen enthalten, die durch das aktuelle Ereignis zur Verfügung. Es gibt einige Ausnahmen, aber getElementText() zum Beispiel muss bereits im START_ELEMENT, aber dann werden Sie versuchen, zu kombinieren, textuelle tokens, die von innen aktuelle element; und bei der Rückkehr, es wird an passenden END_ELEMENT.
Umgekehrt getText() auf START_ELEMENT nicht zurückgeben, etwas sinnvolles (da START_ELEMENT bezieht sich auf tag, nicht child-text-Token/Knoten 'in' start/end-element-pair-Mädchen). Wenn Sie möchten, es zu benutzen, anstatt Sie explizit bewegen Sie den cursor im stream durch den Aufruf streamReader.next(); in der Erwägung, dass getElementText() übernimmt das für Sie.
So, was den Fehler verursacht? Nachdem Sie konsumiert haben, alle start-/end-element-Paare, nächste token wird END_ELEMENT (matching, was war das übergeordnete Begriffe). So müssen Sie überprüfen für den Fall wo Sie kommen, END_ELEMENT, statt noch ein weiteres START_ELEMENT.
InformationsquelleAutor StaxMan
Stand ich vor einem ähnlichen Problem, wie ich immer war "IllegalStateException: Nicht eine textuelle Ereignis" Nachricht
Als ich sah durch den code habe ich herausgefunden, dass, wenn Sie hatte eine Bedingung:
(Bitte beachten Sie: StaXMan hat darauf hin in seiner Antwort!)
Dies geschieht, da zum abrufen von text, XMLStreamReader Instanz muss festgestellt 'XMLStreamConstants.ZEICHEN " - Veranstaltung!
Gibt es vielleicht eine bessere Möglichkeit, dies zu tun...aber das ist eine quick-and-dirty fix (ich habe nur gezeigt, dass code-Zeilen, die von Interesse sein können)
Nun, um dies geschehen, ändern Sie Ihren code leicht:
Hoffe, das hilft!
InformationsquelleAutor
Hier ist ein Beispiel mit XMLStreamReader:
InformationsquelleAutor Adam