我一直在尝试使用 StAX 创建 XML 控制器类。我的问题是我没有得到元素的完整字符串,而是得到了字符串的一小部分。(请注意,出于安全原因,某些内容已被隐藏,这些内容将显示为{content})
Characters characters = event.asCharacters();
if (!characters.isWhiteSpace()) {
System.out.println(characters.getData());
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不返回完整的字符串。
我期望收到的是:
{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;
}
Run Code Online (Sandbox Code Playgroud)
以及我的 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>
Run Code Online (Sandbox Code Playgroud)
StAX解析器只是按照相同的顺序将字符分成更小的部分。您可以使用 重建它StringBuilder,同时还添加一些长度检查以确保安全。或者您可以设置一个标志来默认组合它。
\n\n\n默认情况下,StAX 解析器会将(通常较大的)CHARACTER 事件分解成片段,以避免创建大字符串。您无法控制此中断发生的位置。
\n\n您可以使用工厂属性 \xe2\x80\x9cjavax.xml.stream.isCoalescing\xe2\x80\x9d 来控制此行为并强制其将相邻的 CHARACTER\n 事件合并为单个事件。
\n
参考:
\n\n\n| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |