hallo zusammen,
folgendes xml liegt mir vor:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlresponse>
<trID>
<clientTRID>fr_client_1111</clientTRID>
<serverTRID></serverTRID>
</trID>
<command>ORDER</command>
<timestamp>2011-01-17 12:12:41</timestamp>
<messages>
<message>
<code>2000</code>
<txt>Parameter syntax or value error</txt>
<detail>ErrorDuplicateAastraOrderNr</detail>
</message>
</messages>
</xmlresponse>[/XML]
...ein element <xmlresponse> gibt es nur 1 mal, d.h. dies könnte als "root"-element angesehen werden.
dafür habe ich nun einen parser geschrieben:
...bei diesem besteht aber das problem, dass er "nested"-xml-elemente weiter parst, also weiter in die tiefe geht. das problem besteht beim feld trTd sowie messages: ich möchte aber, dass er bei diesem feldern nicht weiter nach xml parst, sondern den wert dahinter einfach ausliest, in dieser art:
*********************
trID: <clientTRID>fr_client_1111</clientTRID>
<serverTRID></serverTRID>
command: ORDER
timestamp: Mon Jan 17 00:12:41 CET 2011
messages: <message>
<code>2000</code>
<txt>Parameter syntax or value error</txt>
<detail>ErrorDuplicateAastraOrderNr</detail>
</message>
weiss jemand von euch wie das am einfachsten geht?
danke & freundliche grüsse,
jan
folgendes xml liegt mir vor:
[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlresponse>
<trID>
<clientTRID>fr_client_1111</clientTRID>
<serverTRID></serverTRID>
</trID>
<command>ORDER</command>
<timestamp>2011-01-17 12:12:41</timestamp>
<messages>
<message>
<code>2000</code>
<txt>Parameter syntax or value error</txt>
<detail>ErrorDuplicateAastraOrderNr</detail>
</message>
</messages>
</xmlresponse>[/XML]
...ein element <xmlresponse> gibt es nur 1 mal, d.h. dies könnte als "root"-element angesehen werden.
dafür habe ich nun einen parser geschrieben:
Java:
package slstool.beans.parser;
import java.io.ByteArrayInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import slstool.Constants;
import slstool.beans.Xmlresponse;
import slstool.beans.interfaces.BeanMarkerInterface;
import slstool.beans.parser.enums.XmlresponseEnum;
import slstool.beans.parser.generic.GenericBeanParser;
import slstool.beans.parser.interfaces.BeanParserInterface;
import slstool.utils.MyStringUtil;
public class BeanParser_Xmlresponse extends GenericBeanParser implements BeanParserInterface
{
public BeanParser_Xmlresponse()
{
super();
}
@Override
public List<BeanMarkerInterface> parse()
{
final List<Xmlresponse> beanList = new ArrayList<Xmlresponse>();
Xmlresponse xmlresponse = null;
try
{
if (!((xml == null) || (xml.intern() == "")))
{
final XMLInputFactory clXMLInputFactory = XMLInputFactory.newInstance();
final XMLStreamReader clParser = clXMLInputFactory.createXMLStreamReader(new ByteArrayInputStream(xml.getBytes()));
String trID_val = null;
String command_val = null;
String timestamp_val = null;
String messages_val = null;
String lTag = null;
int lCnt = 0;
while (clParser.hasNext())
{
final int lEvent = clParser.next();
switch (lEvent)
{
case XMLStreamConstants.START_ELEMENT:
final String clOutputTag = clParser.getLocalName();
// System.out.println("output -> " + clOutputTag);
for (final XmlresponseEnum lXmlresponseEnum : XmlresponseEnum.values())
{
if (clOutputTag.intern() == lXmlresponseEnum.toString().intern())
{
lTag = clOutputTag;
// System.out.println("lTag: " + lTag);
}
}
break;
case XMLStreamConstants.CHARACTERS:
if (clParser.isWhiteSpace() == false)
{
if (lTag != null)
{
if (lTag.intern() == XmlresponseEnum.trID.toString().intern())
{
trID_val = clParser.getText();
// System.out.println("trID_val: " + trID_val);
}
if (lTag.intern() == XmlresponseEnum.messages.toString().intern())
{
messages_val = clParser.getText();
// System.out.println("messages_val: " + messages_val);
}
if (lTag.intern() == XmlresponseEnum.command.toString().intern())
{
command_val = clParser.getText();
// System.out.println("command_val: " + command_val);
}
if (lTag.intern() == XmlresponseEnum.timestamp.toString().intern())
{
timestamp_val = clParser.getText();
// System.out.println("timestamp_val: " + timestamp_val);
}
lCnt++;
if (lCnt % XmlresponseEnum.values().length == 0)
{
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
final Date d = df.parse(timestamp_val);
xmlresponse = Xmlresponse.createInstance(null, command_val, d, null);
beanList.add(xmlresponse);
}
}
}
break;
default:
break;
}
}
}
else
{
throw new RuntimeException("Input is empty of null");
}
}
catch (final Exception caException)
{
throw new RuntimeException(caException);
}
return new ArrayList<BeanMarkerInterface>(beanList);
}
@Override
public void loadXML(String xml)
{
if (MyStringUtil.stringIsEmptyOrNull(xml))
{
throw new RuntimeException(Constants.Messages.XML_EMPTY_OR_NULL);
}
else
{
super.xml = xml;
}
}
}
...bei diesem besteht aber das problem, dass er "nested"-xml-elemente weiter parst, also weiter in die tiefe geht. das problem besteht beim feld trTd sowie messages: ich möchte aber, dass er bei diesem feldern nicht weiter nach xml parst, sondern den wert dahinter einfach ausliest, in dieser art:
*********************
trID: <clientTRID>fr_client_1111</clientTRID>
<serverTRID></serverTRID>
command: ORDER
timestamp: Mon Jan 17 00:12:41 CET 2011
messages: <message>
<code>2000</code>
<txt>Parameter syntax or value error</txt>
<detail>ErrorDuplicateAastraOrderNr</detail>
</message>
weiss jemand von euch wie das am einfachsten geht?
danke & freundliche grüsse,
jan