【发布时间】:2017-02-21 04:37:32
【问题描述】:
我一直在尝试使用 StAX 创建一个 XML 控制器类。
我的问题是我没有得到一个元素的完整字符串,而是得到了字符串的一小部分。 (请注意,出于安全原因,部分内容已被隐藏,这些内容将显示为{content})
Characters characters = event.asCharacters();
if (!characters.isWhiteSpace()) {
System.out.println(characters.getData());
}
上面的代码没有返回完整的字符串。
我希望收到的是:{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+
我得到的是上面的 5 个单独部分的字符串:{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+
我的代码:
public static ArrayList<SmsCommand> readXML() {
if (init()) {
try {
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
switch (event.getEventType()) {
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = event.asStartElement();
String qName = startElement.getName().getLocalPart();
if (qName.equalsIgnoreCase("command")) {
Iterator<Attribute> attributes = startElement.getAttributes();
command = new SmsCommand(attributes.next().getValue());
}
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = event.asCharacters();
if (!characters.isWhiteSpace()) {
command.addResponse(characters.getData());
}
break;
case XMLStreamConstants.END_ELEMENT:
EndElement endElement = event.asEndElement();
if (endElement.getName().getLocalPart().equalsIgnoreCase("command")) {
commands.add(command);
}
break;
}
}
}
catch (XMLStreamException e) {
e.printStackTrace();
}
}
return commands;
}
还有我的xml:
<?xml version="1.0" ?>
<root>
<command type="{command}">
<response>{responseType} \([0-9]+\) ACC: [0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+</response>
</command>
</root>
【问题讨论】:
-
我认为 StAX 实现拆分
CHARACTERS值是合理的,我同意这个人:stackoverflow.com/a/4567652/2657100 -
@nandsito 您的评论具有误导性,因为您假设
SAX和StAX具有相同的实现。 -
@malat 虽然 SAX 和 StAX 是不同的 API 和实现,但部分提取字符的问题对它们来说很常见